In this notebook we analyze the first “think/believe” task, in which participants completed a series of fill-in-the-blanks by choosing between two options: “think” and “believe.”
Overview
From the preregistration (link):
“Our overarching hypothesis for the present study is that […] other languages will have an epistemic verb that is more likely to be used for religious attitude reports (similar to English “believe”) and a different epistemic verb that is more likely to be used for matter-of-fact attitude reports (similar to English “think”).
For this study, we are examining five languages in five regions of interest: (i) Mandarin in China; (ii) Thai in Thailand; (iii) Bislama (an English-based creole language) on the Melanesian Island of Vanuatu; (iv) Fante in Ghana; and (v) American English in the Bay Area, California.
We thus have five more specific sub-hypotheses. For each of the first four languages / regions of interest, we hypothesize that a set of words or phrases exists whose usage parallels the difference between usage of “think” and “believe” in American English, with one word or phrase (the “think” analogue) being used for more matter-of-fact attitude reports and the other (the “believe” analogue) being more likely to be used for religious attitude reports. That gives us our first four sub-hypotheses: that Mandarin, Thai, Bislama and Fante speakers will each use two different words in a manner parallel to the use of “think” and “believe” in an American English setting as identified by Heiphetz, Landers, and Van Leeuwen. Our fifth sub-hypothesis is that the Bay Area portion of the study will replicate the results of the earlier study of Heiphetz, Landers, and Van Leeuwen."
KW EXECUTIVE SUMMARY (2020-01-19): We replicated the original finding in the US: participants were more likely to circle “believe” for religious than fact questions. We found the same pattern in all five countries/langauges included in this study.
The pattern was somewhat weaker in Ghana/Fante than in other countries/language (though it was still significant), and the pattern was somewhat stronger in Thailand/Thai than in other countries/languages.
Analysis: KW without looking at preregistration
Here’s how I analyzed the data before looking at the preregistration. I think these analyses are valuable because they’re a little more efficient than the preregistered analyses – no need for follow-up tests – and they directly test the question of whether the effect of interest varies across countries/langauges.
Technical note: Unless specified otherwise, all of these analyses use “effect coding” for categorical variables (e.g., country, category of question) – meaning that each country/langauge is compared to the “grand mean” collapsing across all countries/languages. Because of degrees of freedom issues, each analysis only compares 4 of the 5 countries to the grand mean – by default, I’ve left out the comparison of the US/English to the grand mean, but stats for that comparison could easily be calculated (if we left out another country/language instead). This is just to say that you won’t see statements like “The effect was exaggerated in the US relative to other countries,” although they might be true.
KW Analysis #1
First, I used a mixed effects logistic regression predicting how likely a participant was to circle “believe” based on the superordinate category of the question (“religious” questions or “fact” questions), the country they were in/language they were using (US/English, Ghana/Fante, Thailand/Thai, China/Mandarin, or Vanuatu/Bislama), and an interaction between them, with a maximal random effects structure (random interpcepts and slopes by subject, and random intercepts by question). This analysis gives me a sense of (1) Whether participants were more likely to circle “believe” for religious questions than fact questions, and whether this tendency varied by country/language, controlling for the fact that the overall rates of circling “believe” might vary by country/language (and accounting for individual differences and differences across individual questions).
r1.1 <- lmer(believe ~ super_cat * country
+ (1 + super_cat | thb1_subj) + (1 | question),
data = d1_long)
| Parameter |
β |
β' |
β'' |
Std. Err. |
df |
t |
p |
|
| Intercept |
0.60 |
- |
- |
0.03 |
24.00 |
23.59 |
<0.001 |
*** |
| Category (religious) |
0.20 |
0.39 |
0.39 |
0.03 |
26.58 |
7.61 |
<0.001 |
*** |
| Country (Gh.) |
0.09 |
0.10 |
0.10 |
0.01 |
338.99 |
6.71 |
<0.001 |
*** |
| Country (Th.) |
-0.03 |
-0.04 |
-0.04 |
0.01 |
338.99 |
-2.44 |
0.015 |
* |
| Country (Ch.) |
-0.03 |
-0.03 |
-0.03 |
0.01 |
338.99 |
-2.14 |
0.033 |
* |
| Country (Vt.) |
-0.01 |
-0.02 |
-0.02 |
0.01 |
338.99 |
-1.23 |
0.221 |
|
| Category (religious) × Country (Gh.) |
-0.10 |
-0.13 |
-0.13 |
0.02 |
339.01 |
-5.67 |
<0.001 |
*** |
| Category (religious) × Country (Th.) |
0.07 |
0.09 |
0.09 |
0.02 |
339.01 |
4.27 |
<0.001 |
*** |
| Category (religious) × Country (Ch.) |
-0.01 |
-0.01 |
-0.01 |
0.02 |
339.01 |
-0.55 |
0.585 |
|
| Category (religious) × Country (Vt.) |
0.00 |
0.01 |
0.01 |
0.01 |
339.01 |
0.33 |
0.744 |
|
The effects of primary interest are in bold:
- Category (religious): Collapsing across countries/languages, participants were indeed more likely to say “believe” for “religious” questions. This effect is much larger than any of the differences across countries/languages (as you can see by comparing the β values for different effects).
- Country (Gh.): Participants in Ghana were generally more likely than other participants to say “believe,” collapsing across question categories.
- Country (Th.): Participants in Thailand were generally less likely than other participants to say “believe,” collapsing across question categories.
- Country (Ch.): Participants in China were no more or less likely than other participants to say “believe,” collapsing across question categories.
- Country (Vt.): Participants in Vanuatu were no more or less likely than other participants to say “believe,” collapsing across question categories.
- Category (religious) x Country (Gh.): The difference in rates of “believe” responses between question categories was smaller in Ghana than in other countries.
- Category (religious) x Country (Th.): The difference in rates of “believe” responses between question categories was larger in Thailand than in other countries.
- Category (religious) x Country (Ch.): The difference in rates of “believe” responses between question categories was no smaller or larger in China than in other countries.
- Category (religious) x Country (Vt.): The difference in rates of “believe” responses between question categories was no smaller or larger in Vanuatu than in other countries.
Take-away: The predicted effect is evident in this dataset. It appears to be exaggerated in Thailand and diminished in Ghana.
KW Analyses #1a-1e (by country)
Next, I did this same analysis within each country/langauge alone (using the most maximal random effect structure that converged across all countries/languages).
# note: using most maximal common random effects structure
r1.1_us <- lmer(believe ~ super_cat +
# (1 + super_cat | thb1_subj) + (1 | question),
# (1 + super_cat || thb1_subj) + (1 | question), # failed to converge
(1 | thb1_subj) + (1 | question),
# (1 + super_cat | thb1_subj),
data = d1_long %>% filter(country == "US"))
r1.1_gh <- lmer(believe ~ super_cat +
# (1 + super_cat | thb1_subj) + (1 | question),
# (1 + super_cat || thb1_subj) + (1 | question), # failed to converge
(1 | thb1_subj) + (1 | question),
# (1 + super_cat | thb1_subj),
data = d1_long %>% filter(country == "Ghana"))
r1.1_th <- lmer(believe ~ super_cat +
# (1 + super_cat | thb1_subj) + (1 | question),
# (1 + super_cat || thb1_subj) + (1 | question), # failed to converge
(1 | thb1_subj) + (1 | question),
# (1 + super_cat | thb1_subj),
data = d1_long %>% filter(country == "Thailand"))
r1.1_ch <- lmer(believe ~ super_cat +
# (1 + super_cat | thb1_subj) + (1 | question),
# (1 + super_cat || thb1_subj) + (1 | question), # failed to converge
(1 | thb1_subj) + (1 | question),
# (1 + super_cat | thb1_subj),
data = d1_long %>% filter(country == "China"))
r1.1_vt <- lmer(believe ~ super_cat +
# (1 + super_cat | thb1_subj) + (1 | question), # failed to converge
# (1 + super_cat || thb1_subj) + (1 | question),
(1 | thb1_subj) + (1 | question),
# (1 + super_cat | thb1_subj),
data = d1_long %>% filter(country == "Vanuatu"))
| Country |
Parameter |
β |
Std. Err. |
df |
t |
p |
|
| US |
Intercept |
0.58 |
0.02 |
26.45 |
26.45 |
<0.001 |
*** |
| Category (religious) |
0.24 |
0.02 |
23.00 |
11.51 |
<0.001 |
*** |
| Ghana |
Intercept |
0.69 |
0.04 |
30.42 |
18.86 |
<0.001 |
*** |
| Category (religious) |
0.09 |
0.03 |
23.00 |
2.80 |
0.010 |
* |
| Thailand |
Intercept |
0.57 |
0.03 |
29.64 |
20.37 |
<0.001 |
*** |
| Category (religious) |
0.27 |
0.03 |
23.00 |
10.08 |
<0.001 |
*** |
| China |
Intercept |
0.57 |
0.03 |
31.80 |
22.90 |
<0.001 |
*** |
| Category (religious) |
0.19 |
0.02 |
23.00 |
8.55 |
<0.001 |
*** |
| Vanuatu |
Intercept |
0.59 |
0.04 |
23.38 |
14.26 |
<0.001 |
*** |
| Category (religious) |
0.20 |
0.04 |
23.00 |
4.95 |
<0.001 |
*** |
The effects of primary interest are in bold, and the take-away is clear: In every country/language, participants were more likely to say “believe” in “religious” questions than in “fact” questions.
KW Analysis #2
In this analysis, I treated country/language as a random rather than fixed effect (with participants nested within countries). (Note that I had to use a simpler random effects structure in order to get the model to converge.)
r1.2 <- lmer(believe ~ super_cat
# + (1 + super_cat | country/thb1_subj) + (1 | question), # failed to converge
# + (1 + super_cat || country/thb1_subj) + (1 | question), # failed to converge
# + (1 + super_cat | country/thb1_subj), # failed to converge
+ (1 | country/thb1_subj) + (1 | question),
data = d1_long)
| Parameter |
β |
Std. Err. |
df |
t |
p |
|
| Intercept |
0.60 |
0.04 |
11.69 |
16.43 |
<0.001 |
*** |
| Category (religious) |
0.21 |
0.03 |
23.00 |
8.26 |
<0.001 |
*** |
The effect still holds.
KW Analysis #3
Finally, I ran a version of this first model looking at 5 categories of questions (rather than 2 superordinate categories): Christian religious, Buddhist religious, well-known fact, esoteric fact, and personal fact. I compared these categories using planned orthogonal contrasts.
r1.3 <- lmer(believe ~ category * country
# + (1 + category | thb1_subj) + (1 | question), # failed to converge
+ (1 + category || thb1_subj) + (1 | question),
# + (1 + category | thb1_subj),
# + (1 + category || thb1_subj),
# + (1 | thb1_subj) + (1 | question),
data = d1_long)
| Parameter |
β |
Std. Err. |
df |
t |
p |
|
| Intercept |
| Intercept |
0.56 |
0.02 |
23.31 |
34.07 |
<0.001 |
*** |
| Category comparisons |
| Category (Religious vs. fact) |
0.08 |
0.01 |
28.13 |
11.27 |
<0.001 |
*** |
| Category (Christian vs. Buddhist religious) |
0.06 |
0.03 |
20.55 |
2.44 |
0.024 |
* |
| Category (well-known & esoteric vs. personal fact) |
0.06 |
0.01 |
21.75 |
3.90 |
<0.001 |
*** |
| Category (well-known vs. esoteric fact) |
0.07 |
0.03 |
22.30 |
2.67 |
0.014 |
* |
| Country comparisons |
| Country (Gh.) |
0.11 |
0.01 |
348.32 |
7.83 |
<0.001 |
*** |
| Country (Th.) |
-0.04 |
0.01 |
348.32 |
-3.44 |
<0.001 |
*** |
| Country (Ch.) |
-0.03 |
0.01 |
348.32 |
-1.87 |
0.062 |
|
| Country (Vt.) |
-0.01 |
0.01 |
348.32 |
-1.24 |
0.215 |
|
| Interactions: Ghana |
| Category (Religious vs. fact) × Country (Gh.) |
-0.04 |
0.01 |
339.31 |
-5.66 |
<0.001 |
*** |
| Category (Christian vs. Buddhist religious) × Country (Gh.) |
0.05 |
0.02 |
992.01 |
2.85 |
0.004 |
** |
| Category (well-known & esoteric vs. personal fact) × Country (Gh.) |
-0.03 |
0.01 |
341.34 |
-2.66 |
0.008 |
** |
| Category (well-known vs. esoteric fact) × Country (Gh.) |
0.02 |
0.02 |
340.19 |
1.24 |
0.214 |
|
| Interactions: Thailand |
| Category (Religious vs. fact) × Country (Th.) |
0.03 |
0.01 |
339.31 |
4.26 |
<0.001 |
*** |
| Category (Christian vs. Buddhist religious) × Country (Th.) |
-0.05 |
0.01 |
992.01 |
-3.86 |
<0.001 |
*** |
| Category (well-known & esoteric vs. personal fact) × Country (Th.) |
0.02 |
0.01 |
341.34 |
2.26 |
0.024 |
* |
| Category (well-known vs. esoteric fact) × Country (Th.) |
-0.02 |
0.02 |
340.19 |
-1.15 |
0.252 |
|
| Interactions: China |
| Category (Religious vs. fact) × Country (Ch.) |
0.00 |
0.01 |
339.31 |
-0.55 |
0.585 |
|
| Category (Christian vs. Buddhist religious) × Country (Ch.) |
-0.04 |
0.02 |
992.01 |
-2.48 |
0.013 |
* |
| Category (well-known & esoteric vs. personal fact) × Country (Ch.) |
-0.04 |
0.01 |
341.34 |
-3.29 |
0.001 |
** |
| Category (well-known vs. esoteric fact) × Country (Ch.) |
-0.05 |
0.02 |
340.19 |
-2.49 |
0.013 |
* |
| Interactions: Vanuatu |
| Category (Religious vs. fact) × Country (Vt.) |
0.00 |
0.01 |
339.31 |
0.33 |
0.745 |
|
| Category (Christian vs. Buddhist religious) × Country (Vt.) |
0.06 |
0.01 |
992.01 |
4.66 |
<0.001 |
*** |
| Category (well-known & esoteric vs. personal fact) × Country (Vt.) |
0.04 |
0.01 |
341.34 |
4.50 |
<0.001 |
*** |
| Category (well-known vs. esoteric fact) × Country (Vt.) |
0.06 |
0.02 |
340.19 |
3.74 |
<0.001 |
*** |
The first orthogonal contrast compared the two “religious” categories to the three “fact” categories (“Category (Religoius vs. fact)”). This parallels the previous analyses, and the results are similar: Overall, participants were more likely to circle “believe” for religious questions than fact questions, and this tendency was diminished in Ghana and exaggerated in Thailand.
The second orthogonal contrast compared Christian to Buddhist “religious” questions. Overall, participants were more likely to circle “believe” for Christian questions, and this tendency was exaggerated in Ghana and Vanuatu (which were predominantly Christian samples) and diminished in Thailand and China (which were more Buddhist samples).
The third orthogonal contrast compared well-known and esoteric facts, on the one hand, to personal facts, on the other. Overall, participants were more likely to circle “believe” for well-known and esoteric facts, and this tendency was diminished in Ghana and China, and exaggerated in Thailand and Vanuatu.
The fourth orthogonal contrast compared well-known to esoteric facts. Overall, particpants were more likely to circle “believe” for well-known factrs, and then tendency was diminished in China, and exaggerated in Vanuatu.
Note that these findings statistically control for differences across samples in the overall rate of circling “believe” (which was generally higher in Ghana and lower in Thailand).
Analysis: Based on preregistration
From preregistration:
“Survey 1: We will conduct a 5 (Site: China vs. Thailand vs. Vanuatu vs. Ghana vs. United States) x 2 (Statement Type: religion vs. fact) mixed ANOVA with repeated measures on the second factor and the proportion of trials on which participants completed sentences using a form the word “believe” (or its respective translation) as the dependent measure. To look for finer-grained differences between different religious and factual statements, we will also conduct a 5 (Site: China vs. Thailand vs. Vanuatu vs. Ghana vs. United States) x 5 (Statement Type: Buddhist religious statements vs. Christian religious statements vs. life facts vs. well-known facts vs. esoteric facts) mixed ANOVA with repeated measures on the second factor and the proportion of trials on which participants completed sentences using a form of the word “believe” (or its respective translation) as the dependent measure. In all cases where omnibus ANOVAs are significant, we will conduct pairwise analyses comparing each statement type with each other statement type and each site with each other site."
d1_anova <- d1_long %>%
distinct(thb1_subj, country, super_cat, question, believe) %>%
group_by(thb1_subj, country, super_cat) %>%
summarise(prop_believe = mean(believe)) %>%
ungroup() %>%
mutate(thb1_subj = factor(thb1_subj))
contrasts(d1_anova$country) <- contrast_country
contrasts(d1_anova$super_cat) <- contrast_super_cat
Prereg Analysis #1
Here is the first preregistered analyis: a 5 (country) x 2 (question category) mixed ANOVA with repeated measures on the second factor and the proportion of trials on which participants circled “berlieve” as the DV.
r1.4 <- d1_anova %>%
anova_test(dv = prop_believe,
wid = thb1_subj,
between = country,
within = super_cat)
get_anova_table(r1.4)
ANOVA Table (type III tests)
Effect DFn DFd F p p<.05 ges
1 country 4 339 11.390 1.10e-08 * 0.043
2 super_cat 1 339 580.443 1.94e-75 * 0.533
3 country:super_cat 4 339 11.224 1.46e-08 * 0.081
This analysis aligns with the regressions above, suggesting that participants’ tendency to circle “believe” varied by country/language (country) and by question category (super_cat), and the difference between question category varied across countries/languages (i.e., there was an interaction: country:super_cat).
The preregistration indicated that we’d conduct pairwise follow-up analyses comparing the two question categories and comparing pairs of countires/languages – but I don’t really think we’re interested in comparing pairs of countries/languages, so I’m going to skip that for now. Instead, I’ll compare the two questions categories within each country/language (to explore the significant interaction).
Here we go:
Comparing question categories
r1.5a <- t.test(prop_believe ~ super_cat, paired = T, d1_anova); r1.5a
Paired t-test
data: prop_believe by super_cat
t = 24.783, df = 343, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.3836875 0.4498396
sample estimates:
mean of the differences
0.4167636
Collapsing across countries/languages, participants circled significantly more “believe” responses for questions in the religious category (42%) than they did for questions in the fact category (NA%).
Comparing question categories within countries/languages
# US
r1.5b_us <- t.test(prop_believe ~ super_cat, paired = T,
d1_anova %>% filter(country == "US")); r1.5b_us
Paired t-test
data: prop_believe by super_cat
t = 11.179, df = 75, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.3986478 0.5715276
sample estimates:
mean of the differences
0.4850877
# Ghana
r1.5b_gh <- t.test(prop_believe ~ super_cat, paired = T,
d1_anova %>% filter(country == "Ghana")); r1.5b_gh
Paired t-test
data: prop_believe by super_cat
t = 6.6368, df = 47, p-value = 2.909e-08
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.1316330 0.2461448
sample estimates:
mean of the differences
0.1888889
# Thailand
r1.5b_th <- t.test(prop_believe ~ super_cat, paired = T,
d1_anova %>% filter(country == "Thailand")); r1.5b_th
Paired t-test
data: prop_believe by super_cat
t = 16.586, df = 74, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.4669138 0.5944196
sample estimates:
mean of the differences
0.5306667
# China
r1.5b_ch <- t.test(prop_believe ~ super_cat, paired = T,
d1_anova %>% filter(country == "China")); r1.5b_ch
Paired t-test
data: prop_believe by super_cat
t = 7.3784, df = 47, p-value = 2.186e-09
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.2747757 0.4807798
sample estimates:
mean of the differences
0.3777778
# Vanuatu
r1.5b_vt <- t.test(prop_believe ~ super_cat, paired = T,
d1_anova %>% filter(country == "Vanuatu")); r1.5b_vt
Paired t-test
data: prop_believe by super_cat
t = 17.054, df = 96, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.3598187 0.4546143
sample estimates:
mean of the differences
0.4072165
The difference between question categories was significant in each country/language considered alone.
LS0tCnRpdGxlOiAiVGhpbmsgQmVsaWV2ZSAxIChmb3JjZWQgY2hvaWNlKSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpgYGB7ciBzZXR1cH0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGLCBtZXNzYWdlID0gRikKYGBgCgpJbiB0aGlzIG5vdGVib29rIHdlIGFuYWx5emUgdGhlIGZpcnN0ICJ0aGluay9iZWxpZXZlIiB0YXNrLCBpbiB3aGljaCBwYXJ0aWNpcGFudHMgY29tcGxldGVkIGEgc2VyaWVzIG9mIGZpbGwtaW4tdGhlLWJsYW5rcyBieSBjaG9vc2luZyBiZXR3ZWVuIHR3byBvcHRpb25zOiAidGhpbmsiIGFuZCAiYmVsaWV2ZS4iCgoKYGBge3J9CnNvdXJjZSgiLi9zY3JpcHRzL2RlcGVuZGVuY2llcy5SIikKc291cmNlKCIuL3NjcmlwdHMvY3VzdG9tX2Z1bnMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Zhcl9yZWNvZGVfY29udHJhc3QuUiIpCmBgYAoKYGBge3J9CmQxX3JhdyA8LSByZWFkX3hsc3goIi4uL2RhdGEvVGhpbmtCZWxpZXZlMV9vcmdhbml6ZWQueGxzeCIsIHNoZWV0ID0gIlYxJlYyIG5vIGR1cGVzIikgJT4lCiAgIyBlbGltaW5hdGUgb25lIGR1cGxpY2F0ZQogIGdyb3VwX2J5KHRoYjFfc3ViaikgJT4lCiAgdG9wX24oMSwgdGhiMV9iYXRjKSAlPiUgCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0aGIxX2N0cnkgPSBmYWN0b3IodGhiMV9jdHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSkpCmBgYAoKYGBge3J9CmtleTEgPC0gcmVhZF94bHN4KCIuLi9kYXRhL1RoaW5rQmVsaWV2ZTFfb3JnYW5pemVkLnhsc3giLCBzaGVldCA9IDEpWzEsXSAlPiUgCiAgdCgpICU+JSAKICBkYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigicXVlc3Rpb24iKSAlPiUKICByZW5hbWUocXVlc3Rpb25fdGV4dCA9ICIuIikgJT4lCiAgIyBnZXQgcmlkIG9mIHdoaXRlIHNwYWNlCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCJcXHMrIiwgIiAiLCBxdWVzdGlvbl90ZXh0KSkgJT4lCiAgIyBoYW5kIGNvZGUgcXVlc3Rpb24gY2F0ZWdvcmllcwogIG11dGF0ZShjYXRlZ29yeSA9IGNhc2Vfd2hlbigKICAgIGdyZXBsKCJmaW5hbCBwYXBlciIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoImhpZ2h3YXkgaW50byB0b3duIiwgcXVlc3Rpb25fdGV4dCkgfAogICAgICBncmVwbCgiZ3JvY2VyeSBzdG9yZSIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoImNoZW1pc3RyeSBib29rIiwgcXVlc3Rpb25fdGV4dCkgfAogICAgICBncmVwbCgiY29va2luZyBub29kbGVzIiwgcXVlc3Rpb25fdGV4dCkgfiAibGlmZSBmYWN0IiwKICAgIGdyZXBsKCJwcmF5aW5nIHRvIEdvZCIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoImFuZ2VscyBkZWxpdmVyIiwgcXVlc3Rpb25fdGV4dCkgfAogICAgICBncmVwbCgiZ28gdG8gSGVhdmVuIiwgcXVlc3Rpb25fdGV4dCkgfAogICAgICBncmVwbCgiY2hhbmdlZCB3YXRlciIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoImh1bWFuIHNpbnMiLCBxdWVzdGlvbl90ZXh0KSB+ICJDaHJpc3RpYW4gcmVsaWdpb3VzIiwKICAgIGdyZXBsKCJjeWNsZSBvZiBkZWF0aCIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoIkJ1ZGRoYSBmb3VuZCBzcGlyaXR1YWwiLCBxdWVzdGlvbl90ZXh0KSB8CiAgICAgIGdyZXBsKCJsb3R1cyBmbG93ZXIgYmxvb21lZCIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoImdob3N0cyBzdWZmZXIiLCBxdWVzdGlvbl90ZXh0KSB8CiAgICAgIGdyZXBsKCJidXJuaW5nIGluY2Vuc2UiLCBxdWVzdGlvbl90ZXh0KSB+ICJCdWRkaGlzdCByZWxpZ2lvdXMiLAogICAgZ3JlcGwoIm1vb24gZ29lcyBhcm91bmQiLCBxdWVzdGlvbl90ZXh0KSB8CiAgICAgIGdyZXBsKCJCYXJhY2sgT2JhbWEiLCBxdWVzdGlvbl90ZXh0KSB8CiAgICAgIGdyZXBsKCJ1c2luZyBiYXR0ZXJpZXMiLCBxdWVzdGlvbl90ZXh0KSB8CiAgICAgIGdyZXBsKCJCcmF6aWwiLCBxdWVzdGlvbl90ZXh0KSB8CiAgICAgIGdyZXBsKCJhbmNpZW50IFJvbWFuIiwgcXVlc3Rpb25fdGV4dCkgfiAid2VsbC1rbm93biBmYWN0IiwKICAgIGdyZXBsKCJvY3RvcHVzIiwgcXVlc3Rpb25fdGV4dCkgfAogICAgICBncmVwbCgiSm9obiBCcm93biIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoInRhbGxlciBtb3VudGFpbiIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoInNwZWNpZXMgb2YgZmlzaCIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoImNvbnRhaW5zIG1vcmUgY29wcGVyIiwgcXVlc3Rpb25fdGV4dCkgfiAiZXNvdGVyaWMgZmFjdCIsCiAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXykpICU+JQogIG11dGF0ZShjYXRlZ29yeSA9IGZhY3RvcihjYXRlZ29yeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkNocmlzdGlhbiByZWxpZ2lvdXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnVkZGhpc3QgcmVsaWdpb3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlbGwta25vd24gZmFjdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlc290ZXJpYyBmYWN0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpZmUgZmFjdCIpKSwKICAgICAgICAgc3VwZXJfY2F0ID0gY2FzZV93aGVuKGdyZXBsKCJmYWN0IiwgY2F0ZWdvcnkpIH4gImZhY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoInJlbGlnaW91cyIsIGNhdGVnb3J5KSB+ICJyZWxpZ2lvdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLAogICAgICAgICBzdXBlcl9jYXQgPSBmYWN0b3Ioc3VwZXJfY2F0LCBsZXZlbHMgPSBjKCJyZWxpZ2lvdXMiLCAiZmFjdCIpKSkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJvcmRlciIpICU+JQogIG11dGF0ZShvcmRlciA9IGFzLm51bWVyaWMob3JkZXIpLAogICAgICAgICBxdWVzdGlvbl90ZXh0ID0gZ3N1Yigi4oCaw4TDtCIsICInIiwgcXVlc3Rpb25fdGV4dCksCiAgICAgICAgIHF1ZXN0aW9uX3RleHRfc2hvcnQgPSBnc3ViKCJeLip0aGF0ICIsICIuLi4iLCBxdWVzdGlvbl90ZXh0KSwKICAgICAgICAgdmFyX25hbWUgPSBuYW1lcyhkMV9yYXdbbmFtZXMoZDFfcmF3KSAhPSAidGhiMV92ZXJzaW9uIl0pKQpgYGAKCmBgYHtyfQpkMSA8LSBkMV9yYXcgJT4lCiAgZmlsdGVyKHRoYjFfY3RyeSAlaW4lIGxldmVsc19jb3VudHJ5KSAlPiUKICBtdXRhdGUodGhiMV9jdHJ5ID0gZmFjdG9yKHRoYjFfY3RyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpLAogICAgICAgICB0aGIxX2RlbW9fc2V4ID0gZmFjdG9yKHRoYjFfZGVtb19zZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTWFsZSIsICJGZW1hbGUiLCAiT3RoZXIiKSksIAogICAgICAgICB0aGIxX2RlbW9fYWdlID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodGhiMV9kZW1vX2FnZSkpKSAlPiUKICBtdXRhdGVfYXQodmFycyh0aGIxX2RlbW9fcmVncCwgdGhiMV9kZW1vX29sYW5nKSwKICAgICAgICAgICAgZnVucyhmYWN0b3IoLiwgbGV2ZWxzID0gYygiTk8iLCAiWUVTIikpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnModGhiMV9kZW1vX3JlbHksIHRoYjFfZGVtb19pbXByLCB0aGIxX2RlbW9faW1zbiksIAogICAgICAgICAgICBmdW5zKGZhY3RvciguLCBsZXZlbHMgPSAxOjcpKSkgJT4lCiAgbXV0YXRlKHRoYjFfZGVtb193b3JzID0gZmFjdG9yKHRoYjFfZGVtb193b3JzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTmV2ZXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25jZSBhIHllYXIgb3IgbGVzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgZmV3IHRpbWVzIGEgeWVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uY2Ugb3IgdHdpY2UgYSBtb250aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV2ZXJ5IHdlZWsgb3IgbW9yZSBvZnRlbiIpKSwKICAgICAgICAgdGhiMV9kZW1vX2Jnb2QgPSBmYWN0b3IodGhiMV9kZW1vX2Jnb2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk5vdCBhdCBhbGwgYmVsaWV2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGlldmUgc2xpZ2h0bHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxpZXZlIG1vZGVyYXRlbHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxpZXZlIHN0cm9uZ2x5IikpLAogICAgICAgICB0aGIxX2RlbW9fYmJ1aCA9IGZhY3Rvcih0aGIxX2RlbW9fYmJ1aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTm90IGF0IGFsbCBiZWxpZXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVsaWV2ZSBzbGlnaHRseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGlldmUgbW9kZXJhdGVseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGlldmUgc3Ryb25nbHkiKSksCiAgICAgICAgIHRoYjFfZGVtb19ib3NwID0gZmFjdG9yKHRoYjFfZGVtb19ib3NwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJOb3QgYXQgYWxsIGJlbGlldmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxpZXZlIHNsaWdodGx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVsaWV2ZSBtb2RlcmF0ZWx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVsaWV2ZSBzdHJvbmdseSIpKSwKICAgICAgICAgdGhiMV9kZW1vX2F0c24gPSBmYWN0b3IodGhiMV9kZW1vX2F0c24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgc3VwZXJuYXR1cmFsIGZvcmNlcyBvciBiZWluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZSBjYW5ub3Qga25vdyBpZiB0aGVyZSBhcmUgc3VwZXJuYXR1cmFsIGZvcmNlcyBhbmQgYmVpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgbWlnaHQgYmUgc3VwZXJuYXR1cmFsIGZvcmNlcyBhbmQgYmVpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VwZXJuYXR1cmFsIGZvcmNlcyBhbmQgYmVpbmdzIGV4aXN0IGJ1dCB3ZSBjYW5ub3Qga25vdyB3aGF0IHRoZXkgYXJlIGxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBkZWZpbml0ZWx5IGFyZSBzdXBlcm5hdHVyYWwgZm9yY2VzIGFuZCBiZWluZ3MiKSkpICU+JQogIG11dGF0ZV9hdCh2YXJzKHRoYjFfZGVtb19yZWx5LCB0aGIxX2RlbW9faW1wciwgdGhiMV9kZW1vX3dvcnMsIHRoYjFfZGVtb19iZ29kLCAKICAgICAgICAgICAgICAgICB0aGIxX2RlbW9fYmJ1aCwgdGhiMV9kZW1vX2Jvc3AsIHRoYjFfZGVtb19hdHNuLCB0aGIxX2RlbW9faW1zbiksIAogICAgICAgICAgICBmdW5zKG51bSA9IGFzLm51bWVyaWMoLikgLSAxKSkKCmNvbnRyYXN0cyhkMSR0aGIxX2N0cnkpID0gY29udHJhc3RfY291bnRyeQpgYGAKCmBgYHtyfQpkMV9sb25nIDwtIGQxICU+JQogIGdhdGhlcihxdWVzdGlvbiwgcmVzcG9uc2UsIHRoYjFfZ2hvc3RzaHVuZ2VyOnRoYjFfb2JhbWEpICU+JQogIG11dGF0ZSh0aGluayA9IGlmZWxzZShncmVwbCgidGhpbmsiLCByZXNwb25zZSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJ0aG91Z2h0IiwgcmVzcG9uc2UpLCBULCBGKSwKICAgICAgICAgYmVsaWV2ZSA9IGlmZWxzZShncmVwbCgiYmVsaWUiLCByZXNwb25zZSksIFQsIEYpLAogICAgICAgICByZXNwb25zZV9jYXQgPSBjYXNlX3doZW4oYmVsaWV2ZSA9PSBUIH4gImJlbGlldmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmsgPT0gVCB+ICJ0aGluayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgIHJlc3BvbnNlX2NhdCA9IGZhY3RvcihyZXNwb25zZV9jYXQsIGxldmVscyA9IGMoInRoaW5rIiwgImJlbGlldmUiKSkpICU+JQogIGxlZnRfam9pbihrZXkxICU+JSBzZWxlY3QoLXF1ZXN0aW9uKSAlPiUgcmVuYW1lKHF1ZXN0aW9uID0gdmFyX25hbWUpKQoKY29udHJhc3RzKGQxX2xvbmckdGhiMV9jdHJ5KSA9IGNvbnRyYXN0X2NvdW50cnkKIyBjb250cmFzdHMoZDFfbG9uZyRjYXRlZ29yeSkgPSBjb250cmFzdF9jYXRlZ29yeQpjb250cmFzdHMoZDFfbG9uZyRjYXRlZ29yeSkgPSBjb250cmFzdF9jYXRlZ29yeV9vcnRoCmNvbnRyYXN0cyhkMV9sb25nJHN1cGVyX2NhdCkgPSBjb250cmFzdF9zdXBlcl9jYXQKYGBgCgpgYGB7cn0KIyBpbXBsZW1lbnQgZXhjbHVzaW9uIGNyaXRlcmlhIGFuZCByZW5hbWUgY291bnRyeSB2YXJpYWJsZQpkMSA8LSBkMSAlPiUgCiAgZmlsdGVyKHRoYjFfb3JkciA9PSAiWWVzIiwgdGhiMV9hdHRuID09ICJQYXNzIikgJT4lCiAgcmVuYW1lKGNvdW50cnkgPSB0aGIxX2N0cnkpCgpkMV9sb25nIDwtIGQxX2xvbmcgJT4lIAogIGZpbHRlcih0aGIxX29yZHIgPT0gIlllcyIsIHRoYjFfYXR0biA9PSAiUGFzcyIpICU+JQogIHJlbmFtZShjb3VudHJ5ID0gdGhiMV9jdHJ5KQpgYGAKCgojIE92ZXJ2aWV3CgpGcm9tIHRoZSBwcmVyZWdpc3RyYXRpb24gKFtsaW5rXShodHRwczovL2FzcHJlZGljdGVkLm9yZy9wNml5My5wZGYpKToKCj4gIk91ciBvdmVyYXJjaGluZyBoeXBvdGhlc2lzIGZvciB0aGUgcHJlc2VudCBzdHVkeSBpcyB0aGF0IFsuLi5dIG90aGVyIGxhbmd1YWdlcyB3aWxsIGhhdmUgYW4gZXBpc3RlbWljIHZlcmIgdGhhdCBpcyBtb3JlIGxpa2VseSB0byBiZSB1c2VkIGZvciByZWxpZ2lvdXMgYXR0aXR1ZGUgcmVwb3J0cyAoc2ltaWxhciB0byBFbmdsaXNoIOKAnGJlbGlldmXigJ0pIGFuZCBhIGRpZmZlcmVudCBlcGlzdGVtaWMgdmVyYiB0aGF0IGlzIG1vcmUgbGlrZWx5IHRvIGJlIHVzZWQgZm9yIG1hdHRlci1vZi1mYWN0IGF0dGl0dWRlIHJlcG9ydHMgKHNpbWlsYXIgdG8gRW5nbGlzaCDigJx0aGlua+KAnSkuIAo+IAo+IEZvciB0aGlzIHN0dWR5LCB3ZSBhcmUgZXhhbWluaW5nIGZpdmUgbGFuZ3VhZ2VzIGluIGZpdmUgcmVnaW9ucyBvZiBpbnRlcmVzdDogKGkpIE1hbmRhcmluIGluIENoaW5hOyAoaWkpIFRoYWkgaW4gVGhhaWxhbmQ7IChpaWkpIEJpc2xhbWEgKGFuIEVuZ2xpc2gtYmFzZWQgY3Jlb2xlCmxhbmd1YWdlKSBvbiB0aGUgTWVsYW5lc2lhbiBJc2xhbmQgb2YgVmFudWF0dTsgKGl2KSBGYW50ZSBpbiBHaGFuYTsgYW5kICh2KSBBbWVyaWNhbiBFbmdsaXNoIGluIHRoZSBCYXkgQXJlYSwgQ2FsaWZvcm5pYS4gCj4gCj4gV2UgdGh1cyBoYXZlIGZpdmUgbW9yZSBzcGVjaWZpYyBzdWItaHlwb3RoZXNlcy4gRm9yIGVhY2ggb2YgdGhlIGZpcnN0IGZvdXIgbGFuZ3VhZ2VzIC8gcmVnaW9ucyBvZiBpbnRlcmVzdCwgd2UgaHlwb3RoZXNpemUgdGhhdCBhIHNldCBvZiB3b3JkcyBvciBwaHJhc2VzIGV4aXN0cyB3aG9zZSB1c2FnZSBwYXJhbGxlbHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB1c2FnZSBvZiDigJx0aGlua+KAnSBhbmQg4oCcYmVsaWV2ZeKAnSBpbiBBbWVyaWNhbiBFbmdsaXNoLCB3aXRoIG9uZSB3b3JkIG9yIHBocmFzZSAodGhlIOKAnHRoaW5r4oCdIGFuYWxvZ3VlKSBiZWluZyB1c2VkIGZvciBtb3JlIG1hdHRlci1vZi1mYWN0IGF0dGl0dWRlIHJlcG9ydHMgYW5kIHRoZSBvdGhlciAodGhlIOKAnGJlbGlldmXigJ0gYW5hbG9ndWUpIGJlaW5nIG1vcmUgbGlrZWx5IHRvIGJlIHVzZWQgZm9yIHJlbGlnaW91cyBhdHRpdHVkZSByZXBvcnRzLiBUaGF0IGdpdmVzIHVzIG91ciBmaXJzdCBmb3VyIHN1Yi1oeXBvdGhlc2VzOiB0aGF0IE1hbmRhcmluLCBUaGFpLCBCaXNsYW1hIGFuZCBGYW50ZSBzcGVha2VycyB3aWxsIGVhY2ggdXNlIHR3byBkaWZmZXJlbnQgd29yZHMgaW4gYSBtYW5uZXIgcGFyYWxsZWwgdG8gdGhlIHVzZSBvZgrigJx0aGlua+KAnSBhbmQg4oCcYmVsaWV2ZeKAnSBpbiBhbiBBbWVyaWNhbiBFbmdsaXNoIHNldHRpbmcgYXMgaWRlbnRpZmllZCBieSBIZWlwaGV0eiwgTGFuZGVycywgYW5kIFZhbiBMZWV1d2VuLiBPdXIgZmlmdGggc3ViLWh5cG90aGVzaXMgaXMgdGhhdCB0aGUgQmF5IEFyZWEgcG9ydGlvbiBvZiB0aGUgc3R1ZHkgd2lsbCByZXBsaWNhdGUgdGhlIHJlc3VsdHMgb2YgdGhlIGVhcmxpZXIgc3R1ZHkgb2YgSGVpcGhldHosIExhbmRlcnMsIGFuZCBWYW4gTGVldXdlbi4iCgoKPHAgc3R5bGU9ImNvbG9yOmRhcmtyZWQiPioqS1cgRVhFQ1VUSVZFIFNVTU1BUlkgKDIwMjAtMDEtMTkpOiBXZSByZXBsaWNhdGVkIHRoZSBvcmlnaW5hbCBmaW5kaW5nIGluIHRoZSBVUzogcGFydGljaXBhbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gY2lyY2xlICJiZWxpZXZlIiBmb3IgcmVsaWdpb3VzIHRoYW4gZmFjdCBxdWVzdGlvbnMuIFdlIGZvdW5kIHRoZSBzYW1lIHBhdHRlcm4gaW4gYWxsIGZpdmUgY291bnRyaWVzL2xhbmdhdWdlcyBpbmNsdWRlZCBpbiB0aGlzIHN0dWR5LioqPC9wPgoKPHAgc3R5bGU9ImNvbG9yOmRhcmtyZWQiPioqVGhlIHBhdHRlcm4gd2FzIHNvbWV3aGF0IHdlYWtlciBpbiBHaGFuYS9GYW50ZSB0aGFuIGluIG90aGVyIGNvdW50cmllcy9sYW5ndWFnZSAodGhvdWdoIGl0IHdhcyBzdGlsbCBzaWduaWZpY2FudCksIGFuZCB0aGUgcGF0dGVybiB3YXMgc29tZXdoYXQgc3Ryb25nZXIgaW4gVGhhaWxhbmQvVGhhaSB0aGFuIGluIG90aGVyIGNvdW50cmllcy9sYW5ndWFnZXMuKio8L3A+CgoKIyBTYW1wbGVzCgpCZWZvcmUgd2UgYmVnaW4sIGl0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB3ZSBoYWQgdW5lcXVhbCBzYW1wbGUgc2l6ZXMgYnkgY291bnRyeToKCmBgYHtyfQpkMV9yYXcgJT4lIGNvdW50KHRoYjFfY3RyeSkKYGBgCgpIb3dldmVyLCBgciBkMV9yYXcgJT4lIGZpbHRlcih0aGIxX29yZHIgPT0gIk5vIikgJT4lIGNvdW50KCkgJT4lIGFzLm51bWVyaWMoKWAgcGFydGljaXBhbnRzIGNvbXBsZXRlZCB0aGlzIHRhc2sgYWZ0ZXIgY29tcGxldGluZyBvdGhlciBzdXJ2ZXlzLCBhbmQgYW4gYWRkaXRpb25hbCBgciBkMV9yYXcgJT4lIGZpbHRlcih0aGIxX29yZHIgPT0gIlllcyIsIHRoYjFfYXR0biA9PSAiRmFpbCIpICU+JSBjb3VudCgpICU+JSBhcy5udW1lcmljKClgIGZhaWxlZCB0aGUgYXR0ZW50aW9uIGNoZWNrLiBJbiB0aGUgZm9sbG93aW5nIGFuYWx5c2VzIEkgd2lsbCBleGNsdWRlIHRoZXNlIHBhcnRpY2lwYW50cywgbGVhdmluZyB1cyB3aXRoIHRoZSBmb2xsb3dpbmcgc2FtcGxlczoKCmBgYHtyfQpkMSAlPiUgY291bnQoY291bnRyeSkKYGBgCgpgYGB7cn0Kc2FtcGxlX3NpemVfZDEgPC0gZDEgJT4lIAogIGNvdW50KGNvdW50cnkpICU+JSAKICBkYXRhLmZyYW1lKCkgJT4lCiAgbXV0YXRlKGNvdW50cnlfbiA9IHBhc3RlMChjb3VudHJ5LCAiIChuPSIsIG4sICIpIiksCiAgICAgICAgIGNvdW50cnlfbiA9IHJlb3JkZXIoY291bnRyeV9uLCBhcy5udW1lcmljKGNvdW50cnkpKSkKYGBgCgoKIyBQbG90cwoKV2UnbGwgYmVnaW4gYnkgcGxvdHRpbmcgcmVzcG9uc2VzIG9mICJ0aGluayIgKHJlZCkgdnMuICJiZWxpZXZlIiAodHVycXVvaXNlKSB0byBnZXQgYW4gb3ZlcmFsbCBzZW5zZSBvZiBhbnkgcGF0dGVybnMgaW4gdGhlIGRhdGEuCgojIyBCeSBzdXBlcm9yZGluYXRlIGNhdGVnb3J5CgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNX0KZDFfbG9uZyAlPiUKICBsZWZ0X2pvaW4oc2FtcGxlX3NpemVfZDEpICU+JQogIGdncGxvdChhZXMoeCA9IHN1cGVyX2NhdCwgCiAgICAgICAgICAgICAjIHB1dCBOQXMgb24gdG9wIG9mIGJhcgogICAgICAgICAgICAgZmlsbCA9IGZhY3RvcihyZXNwb25zZV9jYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoTkEsICJ0aGluayIsICJiZWxpZXZlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlID0gTlVMTCkpKSArCiAgZmFjZXRfZ3JpZCguIH4gY291bnRyeV9uLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIGFscGhhID0gMC43LCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjEpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIGxhYnMoeCA9ICJjYXRlZ29yeSIsIHkgPSAicHJvcG9ydGlvbiIsIGZpbGwgPSAicmVzcG9uc2UiKQpgYGAKCiMjIEJ5IGNhdGVnb3J5CgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNX0KZDFfbG9uZyAlPiUKICBsZWZ0X2pvaW4oc2FtcGxlX3NpemVfZDEpICU+JQogIGdncGxvdChhZXMoeCA9IGNhdGVnb3J5LCAKICAgICAgICAgICAgICMgcHV0IE5BcyBvbiB0b3Agb2YgYmFyCiAgICAgICAgICAgICBmaWxsID0gZmFjdG9yKHJlc3BvbnNlX2NhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhOQSwgInRoaW5rIiwgImJlbGlldmUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGUgPSBOVUxMKSkpICsKICBmYWNldF9ncmlkKC4gfiBjb3VudHJ5X24sIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIiwgYWxwaGEgPSAwLjcsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMSkgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArCiAgbGFicyh4ID0gImNhdGVnb3J5IiwgeSA9ICJwcm9wb3J0aW9uIiwgZmlsbCA9ICJyZXNwb25zZSIpCmBgYAoKIyMgQnkgcXVlc3Rpb24KCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43fQpkMV9sb25nICU+JQogIGxlZnRfam9pbihzYW1wbGVfc2l6ZV9kMSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihzdHJfd3JhcChxdWVzdGlvbl90ZXh0X3Nob3J0LCA0MCksIG9yZGVyKSwgCiAgICAgICAgICAgICAjIHB1dCBOQXMgb24gdG9wIG9mIGJhcgogICAgICAgICAgICAgZmlsbCA9IGZhY3RvcihyZXNwb25zZV9jYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoTkEsICJ0aGluayIsICJiZWxpZXZlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlID0gTlVMTCkpKSArCiAgZmFjZXRfZ3JpZChjb3VudHJ5X24gfiBjYXRlZ29yeSwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBhbHBoYSA9IDAuNywgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4xKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgcGxvdC5tYXJnaW4gPSAodW5pdChjKDAuMiwgMC4yLCAwLjIsIDEuOCksICJjbSIpKSkgKwogIGxhYnMoeCA9ICJjYXRlZ29yeSIsIHkgPSAicHJvcG9ydGlvbiIsIGZpbGwgPSAicmVzcG9uc2UiKQpgYGAKCgojIEFuYWx5c2lzOiBLVyB3aXRob3V0IGxvb2tpbmcgYXQgcHJlcmVnaXN0cmF0aW9uCgpIZXJlJ3MgaG93IEkgYW5hbHl6ZWQgdGhlIGRhdGEgYmVmb3JlIGxvb2tpbmcgYXQgdGhlIHByZXJlZ2lzdHJhdGlvbi4gSSB0aGluayB0aGVzZSBhbmFseXNlcyBhcmUgdmFsdWFibGUgYmVjYXVzZSB0aGV5J3JlIGEgbGl0dGxlIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIHByZXJlZ2lzdGVyZWQgYW5hbHlzZXMgLS0gbm8gbmVlZCBmb3IgZm9sbG93LXVwIHRlc3RzIC0tIGFuZCB0aGV5IGRpcmVjdGx5IHRlc3QgdGhlIHF1ZXN0aW9uIG9mIHdoZXRoZXIgdGhlIGVmZmVjdCBvZiBpbnRlcmVzdCB2YXJpZXMgYWNyb3NzIGNvdW50cmllcy9sYW5nYXVnZXMuCgpUZWNobmljYWwgbm90ZTogVW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UsIGFsbCBvZiB0aGVzZSBhbmFseXNlcyB1c2UgImVmZmVjdCBjb2RpbmciIGZvciBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgKGUuZy4sIGNvdW50cnksIGNhdGVnb3J5IG9mIHF1ZXN0aW9uKSAtLSBtZWFuaW5nIHRoYXQgZWFjaCBjb3VudHJ5L2xhbmdhdWdlIGlzIGNvbXBhcmVkIHRvIHRoZSAiZ3JhbmQgbWVhbiIgY29sbGFwc2luZyBhY3Jvc3MgYWxsIGNvdW50cmllcy9sYW5ndWFnZXMuIEJlY2F1c2Ugb2YgZGVncmVlcyBvZiBmcmVlZG9tIGlzc3VlcywgZWFjaCBhbmFseXNpcyBvbmx5IGNvbXBhcmVzIDQgb2YgdGhlIDUgY291bnRyaWVzIHRvIHRoZSBncmFuZCBtZWFuIC0tIGJ5IGRlZmF1bHQsIEkndmUgbGVmdCBvdXQgdGhlIGNvbXBhcmlzb24gb2YgdGhlIFVTL0VuZ2xpc2ggdG8gdGhlIGdyYW5kIG1lYW4sIGJ1dCBzdGF0cyBmb3IgdGhhdCBjb21wYXJpc29uIGNvdWxkIGVhc2lseSBiZSBjYWxjdWxhdGVkIChpZiB3ZSBsZWZ0IG91dCBhbm90aGVyIGNvdW50cnkvbGFuZ3VhZ2UgaW5zdGVhZCkuIFRoaXMgaXMganVzdCB0byBzYXkgdGhhdCB5b3Ugd29uJ3Qgc2VlIHN0YXRlbWVudHMgbGlrZSAiVGhlIGVmZmVjdCB3YXMgZXhhZ2dlcmF0ZWQgaW4gdGhlIFVTIHJlbGF0aXZlIHRvIG90aGVyIGNvdW50cmllcywiIGFsdGhvdWdoIHRoZXkgbWlnaHQgYmUgdHJ1ZS4KCiMjIEtXIEFuYWx5c2lzICMxCgpGaXJzdCwgSSB1c2VkIGEgbWl4ZWQgZWZmZWN0cyBsb2dpc3RpYyByZWdyZXNzaW9uIHByZWRpY3RpbmcgaG93IGxpa2VseSBhIHBhcnRpY2lwYW50IHdhcyB0byBjaXJjbGUgImJlbGlldmUiIGJhc2VkIG9uIHRoZSBzdXBlcm9yZGluYXRlIGNhdGVnb3J5IG9mIHRoZSBxdWVzdGlvbiAoInJlbGlnaW91cyIgcXVlc3Rpb25zIG9yICJmYWN0IiBxdWVzdGlvbnMpLCB0aGUgY291bnRyeSB0aGV5IHdlcmUgaW4vbGFuZ3VhZ2UgdGhleSB3ZXJlIHVzaW5nIChVUy9FbmdsaXNoLCBHaGFuYS9GYW50ZSwgVGhhaWxhbmQvVGhhaSwgQ2hpbmEvTWFuZGFyaW4sIG9yIFZhbnVhdHUvQmlzbGFtYSksIGFuZCBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZW0sIHdpdGggYSBtYXhpbWFsIHJhbmRvbSBlZmZlY3RzIHN0cnVjdHVyZSAocmFuZG9tIGludGVycGNlcHRzIGFuZCBzbG9wZXMgYnkgc3ViamVjdCwgYW5kIHJhbmRvbSBpbnRlcmNlcHRzIGJ5IHF1ZXN0aW9uKS4gVGhpcyBhbmFseXNpcyBnaXZlcyBtZSBhIHNlbnNlIG9mICgxKSBXaGV0aGVyIHBhcnRpY2lwYW50cyB3ZXJlIG1vcmUgbGlrZWx5IHRvIGNpcmNsZSAiYmVsaWV2ZSIgZm9yIHJlbGlnaW91cyBxdWVzdGlvbnMgdGhhbiBmYWN0IHF1ZXN0aW9ucywgYW5kIHdoZXRoZXIgdGhpcyB0ZW5kZW5jeSB2YXJpZWQgYnkgY291bnRyeS9sYW5ndWFnZSwgY29udHJvbGxpbmcgZm9yIHRoZSBmYWN0IHRoYXQgdGhlIG92ZXJhbGwgcmF0ZXMgb2YgY2lyY2xpbmcgImJlbGlldmUiIG1pZ2h0IHZhcnkgYnkgY291bnRyeS9sYW5ndWFnZSAoYW5kIGFjY291bnRpbmcgZm9yIGluZGl2aWR1YWwgZGlmZmVyZW5jZXMgYW5kIGRpZmZlcmVuY2VzIGFjcm9zcyBpbmRpdmlkdWFsIHF1ZXN0aW9ucykuCgpgYGB7ciwgZWNobyA9IFR9CnIxLjEgPC0gbG1lcihiZWxpZXZlIH4gc3VwZXJfY2F0ICogY291bnRyeSAKICAgICAgICAgICAgICsgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksCiAgICAgICAgICAgICBkYXRhID0gZDFfbG9uZykKYGBgCgpgYGB7cn0KcmVndGFiX2Z1bihyMS4xLCBzdGRfYmV0YSA9IFQpICU+JSByZWd0YWJfc3R5bGVfZnVuKHJvd19lbXBoID0gYygyLCA3OjEwKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CnJlZ3RhYl9yYW5fZnVuKHIxLjEsIHN1YmpfdmFyID0gInRoYjFfc3ViaiIpICU+JSByZWd0YWJfc3R5bGVfZnVuKCkKYGBgCgpUaGUgZWZmZWN0cyBvZiBwcmltYXJ5IGludGVyZXN0IGFyZSBpbiBib2xkOgoKLSAqKkNhdGVnb3J5IChyZWxpZ2lvdXMpKio6IENvbGxhcHNpbmcgYWNyb3NzIGNvdW50cmllcy9sYW5ndWFnZXMsIHBhcnRpY2lwYW50cyB3ZXJlIGluZGVlZCBtb3JlIGxpa2VseSB0byBzYXkgImJlbGlldmUiIGZvciAicmVsaWdpb3VzIiBxdWVzdGlvbnMuIFRoaXMgZWZmZWN0IGlzIG11Y2ggbGFyZ2VyIHRoYW4gYW55IG9mIHRoZSBkaWZmZXJlbmNlcyBhY3Jvc3MgY291bnRyaWVzL2xhbmd1YWdlcyAoYXMgeW91IGNhbiBzZWUgYnkgY29tcGFyaW5nIHRoZSDOsiB2YWx1ZXMgZm9yIGRpZmZlcmVudCBlZmZlY3RzKS4KLSBDb3VudHJ5IChHaC4pOiBQYXJ0aWNpcGFudHMgaW4gR2hhbmEgd2VyZSBnZW5lcmFsbHkgbW9yZSBsaWtlbHkgdGhhbiBvdGhlciBwYXJ0aWNpcGFudHMgdG8gc2F5ICJiZWxpZXZlLCIgY29sbGFwc2luZyBhY3Jvc3MgcXVlc3Rpb24gY2F0ZWdvcmllcy4KLSBDb3VudHJ5IChUaC4pOiBQYXJ0aWNpcGFudHMgaW4gVGhhaWxhbmQgd2VyZSBnZW5lcmFsbHkgbGVzcyBsaWtlbHkgdGhhbiBvdGhlciBwYXJ0aWNpcGFudHMgdG8gc2F5ICJiZWxpZXZlLCIgY29sbGFwc2luZyBhY3Jvc3MgcXVlc3Rpb24gY2F0ZWdvcmllcy4KLSBDb3VudHJ5IChDaC4pOiBQYXJ0aWNpcGFudHMgaW4gQ2hpbmEgd2VyZSBubyBtb3JlIG9yIGxlc3MgbGlrZWx5IHRoYW4gb3RoZXIgcGFydGljaXBhbnRzIHRvIHNheSAiYmVsaWV2ZSwiIGNvbGxhcHNpbmcgYWNyb3NzIHF1ZXN0aW9uIGNhdGVnb3JpZXMuCi0gQ291bnRyeSAoVnQuKTogUGFydGljaXBhbnRzIGluIFZhbnVhdHUgd2VyZSBubyBtb3JlIG9yIGxlc3MgbGlrZWx5IHRoYW4gb3RoZXIgcGFydGljaXBhbnRzIHRvIHNheSAiYmVsaWV2ZSwiIGNvbGxhcHNpbmcgYWNyb3NzIHF1ZXN0aW9uIGNhdGVnb3JpZXMuCi0gKipDYXRlZ29yeSAocmVsaWdpb3VzKSB4IENvdW50cnkgKEdoLikqKjogVGhlIGRpZmZlcmVuY2UgaW4gcmF0ZXMgb2YgImJlbGlldmUiIHJlc3BvbnNlcyBiZXR3ZWVuIHF1ZXN0aW9uIGNhdGVnb3JpZXMgd2FzIHNtYWxsZXIgaW4gR2hhbmEgdGhhbiBpbiBvdGhlciBjb3VudHJpZXMuCi0gKipDYXRlZ29yeSAocmVsaWdpb3VzKSB4IENvdW50cnkgKFRoLikqKjogVGhlIGRpZmZlcmVuY2UgaW4gcmF0ZXMgb2YgImJlbGlldmUiIHJlc3BvbnNlcyBiZXR3ZWVuIHF1ZXN0aW9uIGNhdGVnb3JpZXMgd2FzIGxhcmdlciBpbiBUaGFpbGFuZCB0aGFuIGluIG90aGVyIGNvdW50cmllcy4KLSAqKkNhdGVnb3J5IChyZWxpZ2lvdXMpIHggQ291bnRyeSAoQ2guKSoqOiBUaGUgZGlmZmVyZW5jZSBpbiByYXRlcyBvZiAiYmVsaWV2ZSIgcmVzcG9uc2VzIGJldHdlZW4gcXVlc3Rpb24gY2F0ZWdvcmllcyB3YXMgbm8gc21hbGxlciBvciBsYXJnZXIgaW4gQ2hpbmEgdGhhbiBpbiBvdGhlciBjb3VudHJpZXMuCi0gKipDYXRlZ29yeSAocmVsaWdpb3VzKSB4IENvdW50cnkgKFZ0LikqKjogVGhlIGRpZmZlcmVuY2UgaW4gcmF0ZXMgb2YgImJlbGlldmUiIHJlc3BvbnNlcyBiZXR3ZWVuIHF1ZXN0aW9uIGNhdGVnb3JpZXMgd2FzIG5vIHNtYWxsZXIgb3IgbGFyZ2VyIGluIFZhbnVhdHUgdGhhbiBpbiBvdGhlciBjb3VudHJpZXMuCgoqKlRha2UtYXdheTogVGhlIHByZWRpY3RlZCBlZmZlY3QgaXMgZXZpZGVudCBpbiB0aGlzIGRhdGFzZXQuIEl0IGFwcGVhcnMgdG8gYmUgZXhhZ2dlcmF0ZWQgaW4gVGhhaWxhbmQgYW5kIGRpbWluaXNoZWQgaW4gR2hhbmEuKioKCiMjIEtXIEFuYWx5c2VzICMxYS0xZSAoYnkgY291bnRyeSkKCk5leHQsIEkgZGlkIHRoaXMgc2FtZSBhbmFseXNpcyB3aXRoaW4gZWFjaCBjb3VudHJ5L2xhbmdhdWdlIGFsb25lICh1c2luZyB0aGUgbW9zdCBtYXhpbWFsIHJhbmRvbSBlZmZlY3Qgc3RydWN0dXJlIHRoYXQgY29udmVyZ2VkIGFjcm9zcyBhbGwgY291bnRyaWVzL2xhbmd1YWdlcykuIAoKYGBge3IsIGVjaG8gPSBUfQojIG5vdGU6IHVzaW5nIG1vc3QgbWF4aW1hbCBjb21tb24gcmFuZG9tIGVmZmVjdHMgc3RydWN0dXJlCnIxLjFfdXMgPC0gbG1lcihiZWxpZXZlIH4gc3VwZXJfY2F0ICsgCiAgICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksIAogICAgICAgICAgICAgICAgICAjICgxICsgc3VwZXJfY2F0IHx8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwgIyBmYWlsZWQgdG8gY29udmVyZ2UKICAgICAgICAgICAgICAgICAgKDEgfCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksCiAgICAgICAgICAgICAgICAjICgxICsgc3VwZXJfY2F0IHwgdGhiMV9zdWJqKSwKICAgICAgICAgICAgICAgIGRhdGEgPSBkMV9sb25nICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiVVMiKSkKCnIxLjFfZ2ggPC0gbG1lcihiZWxpZXZlIH4gc3VwZXJfY2F0ICsgCiAgICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksCiAgICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICAgICAgICAoMSB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwKICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopLAogICAgICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJHaGFuYSIpKQoKcjEuMV90aCA8LSBsbWVyKGJlbGlldmUgfiBzdXBlcl9jYXQgKyAKICAgICAgICAgICAgICAgICAgIyAoMSArIHN1cGVyX2NhdCB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwgCiAgICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICAgICAgICAoMSB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwKICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopLAogICAgICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJUaGFpbGFuZCIpKQoKcjEuMV9jaCA8LSBsbWVyKGJlbGlldmUgfiBzdXBlcl9jYXQgKyAKICAgICAgICAgICAgICAgICAgIyAoMSArIHN1cGVyX2NhdCB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwgCiAgICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICAgICAgICAoMSB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwKICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopLAogICAgICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJDaGluYSIpKQoKcjEuMV92dCA8LSBsbWVyKGJlbGlldmUgfiBzdXBlcl9jYXQgKyAKICAgICAgICAgICAgICAgICAgIyAoMSArIHN1cGVyX2NhdCB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwgIyBmYWlsZWQgdG8gY29udmVyZ2UKICAgICAgICAgICAgICAgICAgIyAoMSArIHN1cGVyX2NhdCB8fCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksCiAgICAgICAgICAgICAgICAgICgxIHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLAogICAgICAgICAgICAgICAgIyAoMSArIHN1cGVyX2NhdCB8IHRoYjFfc3ViaiksCiAgICAgICAgICAgICAgICBkYXRhID0gZDFfbG9uZyAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlZhbnVhdHUiKSkKYGBgCgpgYGB7cn0KYmluZF9yb3dzKHJlZ3RhYl9mdW4ocjEuMV91cykgJT4lIG11dGF0ZShDb3VudHJ5ID0gIlVTIiksCiAgICAgICAgICByZWd0YWJfZnVuKHIxLjFfZ2gpICU+JSBtdXRhdGUoQ291bnRyeSA9ICJHaGFuYSIpLAogICAgICAgICAgcmVndGFiX2Z1bihyMS4xX3RoKSAlPiUgbXV0YXRlKENvdW50cnkgPSAiVGhhaWxhbmQiKSwKICAgICAgICAgIHJlZ3RhYl9mdW4ocjEuMV9jaCkgJT4lIG11dGF0ZShDb3VudHJ5ID0gIkNoaW5hIiksCiAgICAgICAgICByZWd0YWJfZnVuKHIxLjFfdnQpICU+JSBtdXRhdGUoQ291bnRyeSA9ICJWYW51YXR1IikpICU+JQogIHNlbGVjdChDb3VudHJ5LCBldmVyeXRoaW5nKCkpICU+JQogIHJlZ3RhYl9zdHlsZV9mdW4ocm93X2VtcGggPSBzZXEoMiwgMTAsIDIpKSAlPiUKICBjb2xsYXBzZV9yb3dzKDEpCmBgYAoKVGhlIGVmZmVjdHMgb2YgcHJpbWFyeSBpbnRlcmVzdCBhcmUgaW4gYm9sZCwgYW5kICoqdGhlIHRha2UtYXdheSBpcyBjbGVhcjogSW4gZXZlcnkgY291bnRyeS9sYW5ndWFnZSwgcGFydGljaXBhbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gc2F5ICJiZWxpZXZlIiBpbiAicmVsaWdpb3VzIiBxdWVzdGlvbnMgdGhhbiBpbiAiZmFjdCIgcXVlc3Rpb25zKiouCgoKIyMgS1cgQW5hbHlzaXMgIzIKCkluIHRoaXMgYW5hbHlzaXMsIEkgdHJlYXRlZCBjb3VudHJ5L2xhbmd1YWdlIGFzIGEgcmFuZG9tIHJhdGhlciB0aGFuIGZpeGVkIGVmZmVjdCAod2l0aCBwYXJ0aWNpcGFudHMgbmVzdGVkIHdpdGhpbiBjb3VudHJpZXMpLiAoTm90ZSB0aGF0IEkgaGFkIHRvIHVzZSBhIHNpbXBsZXIgcmFuZG9tIGVmZmVjdHMgc3RydWN0dXJlIGluIG9yZGVyIHRvIGdldCB0aGUgbW9kZWwgdG8gY29udmVyZ2UuKQoKYGBge3IsIGVjaG8gPSBUfQpyMS4yIDwtIGxtZXIoYmVsaWV2ZSB+IHN1cGVyX2NhdCAKICAgICAgICAgICAgICMgKyAoMSArIHN1cGVyX2NhdCB8IGNvdW50cnkvdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICAgIyArICgxICsgc3VwZXJfY2F0IHx8IGNvdW50cnkvdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICAgIyArICgxICsgc3VwZXJfY2F0IHwgY291bnRyeS90aGIxX3N1YmopLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICAgKyAoMSB8IGNvdW50cnkvdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLAogICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcpCmBgYAoKYGBge3J9CnJlZ3RhYl9mdW4ocjEuMikgJT4lIHJlZ3RhYl9zdHlsZV9mdW4ocm93X2VtcGggPSAyKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KcmVndGFiX3Jhbl9mdW4ocjEuMiwgc3Vial92YXIgPSAidGhiMV9zdWJqIikgJT4lIHJlZ3RhYl9zdHlsZV9mdW4oKQpgYGAKClRoZSBlZmZlY3Qgc3RpbGwgaG9sZHMuCgojIyBLVyBBbmFseXNpcyAjMwoKRmluYWxseSwgSSByYW4gYSB2ZXJzaW9uIG9mIHRoaXMgZmlyc3QgbW9kZWwgbG9va2luZyBhdCA1IGNhdGVnb3JpZXMgb2YgcXVlc3Rpb25zIChyYXRoZXIgdGhhbiAyIHN1cGVyb3JkaW5hdGUgY2F0ZWdvcmllcyk6IENocmlzdGlhbiByZWxpZ2lvdXMsIEJ1ZGRoaXN0IHJlbGlnaW91cywgd2VsbC1rbm93biBmYWN0LCBlc290ZXJpYyBmYWN0LCBhbmQgcGVyc29uYWwgZmFjdC4gSSBjb21wYXJlZCB0aGVzZSBjYXRlZ29yaWVzIHVzaW5nIHBsYW5uZWQgb3J0aG9nb25hbCBjb250cmFzdHMuCgpgYGB7ciwgZWNobyA9IFR9CnIxLjMgPC0gbG1lcihiZWxpZXZlIH4gY2F0ZWdvcnkgKiBjb3VudHJ5IAogICAgICAgICAgICAgIyArICgxICsgY2F0ZWdvcnkgfCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksICMgZmFpbGVkIHRvIGNvbnZlcmdlCiAgICAgICAgICAgICArICgxICsgY2F0ZWdvcnkgfHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLAogICAgICAgICAgICAgIyArICgxICsgY2F0ZWdvcnkgfCB0aGIxX3N1YmopLCAKICAgICAgICAgICAgICMgKyAoMSArIGNhdGVnb3J5IHx8IHRoYjFfc3ViaiksIAogICAgICAgICAgICAgIyArICgxIHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLAogICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcpCmBgYAoKYGBge3J9CnJlZ3RhYl9mdW4ocjEuMywgCiAgICAgICAgICAgcHJlZGljdG9yX3ZhcjEgPSAiY2F0ZWdvcnlfcmVsaWdfZmFjdCIsIAogICAgICAgICAgIHByZWRpY3Rvcl9uYW1lMSA9ICJDYXRlZ29yeSAoUmVsaWdpb3VzIHZzLiBmYWN0KSIsCiAgICAgICAgICAgcHJlZGljdG9yX3ZhcjIgPSAiY2F0ZWdvcnlfcmVsaWdfQ19CIiwKICAgICAgICAgICBwcmVkaWN0b3JfbmFtZTIgPSAiQ2F0ZWdvcnkgKENocmlzdGlhbiB2cy4gQnVkZGhpc3QgcmVsaWdpb3VzKSIsCiAgICAgICAgICAgcHJlZGljdG9yX3ZhcjMgPSAiY2F0ZWdvcnlfZmFjdF9XRV9MIiwKICAgICAgICAgICBwcmVkaWN0b3JfbmFtZTMgPSAiQ2F0ZWdvcnkgKHdlbGwta25vd24gJiBlc290ZXJpYyB2cy4gcGVyc29uYWwgZmFjdCkiLAogICAgICAgICAgIHByZWRpY3Rvcl92YXI0ID0gImNhdGVnb3J5X2ZhY3RfV19FIiwKICAgICAgICAgICBwcmVkaWN0b3JfbmFtZTQgPSAiQ2F0ZWdvcnkgKHdlbGwta25vd24gdnMuIGVzb3RlcmljIGZhY3QpIikgJT4lIAogIHJlZ3RhYl9zdHlsZV9mdW4ocm93X2VtcGggPSBjKDI6NSwgMTA6MjUpKSAlPiUKICBncm91cF9yb3dzKCJJbnRlcmNlcHQiLCBzdGFydF9yb3cgPSAxLCBlbmRfcm93ID0gMSkgJT4lCiAgZ3JvdXBfcm93cygiQ2F0ZWdvcnkgY29tcGFyaXNvbnMiLCBzdGFydF9yb3cgPSAyLCBlbmRfcm93ID0gNSkgJT4lCiAgZ3JvdXBfcm93cygiQ291bnRyeSBjb21wYXJpc29ucyIsIHN0YXJ0X3JvdyA9IDYsIGVuZF9yb3cgPSA5KSAlPiUKICBncm91cF9yb3dzKCJJbnRlcmFjdGlvbnM6IEdoYW5hIiwgc3RhcnRfcm93ID0gMTAsIGVuZF9yb3cgPSAxMykgJT4lCiAgZ3JvdXBfcm93cygiSW50ZXJhY3Rpb25zOiBUaGFpbGFuZCIsIHN0YXJ0X3JvdyA9IDE0LCBlbmRfcm93ID0gMTcpICU+JQogIGdyb3VwX3Jvd3MoIkludGVyYWN0aW9uczogQ2hpbmEiLCBzdGFydF9yb3cgPSAxOCwgZW5kX3JvdyA9IDIxKSAlPiUKICBncm91cF9yb3dzKCJJbnRlcmFjdGlvbnM6IFZhbnVhdHUiLCBzdGFydF9yb3cgPSAyMiwgZW5kX3JvdyA9IDI1KQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KcmVndGFiX3Jhbl9mdW4ocjEuMywgc3Vial92YXIgPSAidGhiMV9zdWJqIikgJT4lIHJlZ3RhYl9zdHlsZV9mdW4oKQpgYGAKClRoZSBmaXJzdCBvcnRob2dvbmFsIGNvbnRyYXN0IGNvbXBhcmVkIHRoZSB0d28gInJlbGlnaW91cyIgY2F0ZWdvcmllcyB0byB0aGUgdGhyZWUgImZhY3QiIGNhdGVnb3JpZXMgKCJDYXRlZ29yeSAoUmVsaWdvaXVzIHZzLiBmYWN0KSIpLiBUaGlzIHBhcmFsbGVscyB0aGUgcHJldmlvdXMgYW5hbHlzZXMsIGFuZCB0aGUgcmVzdWx0cyBhcmUgc2ltaWxhcjogT3ZlcmFsbCwgcGFydGljaXBhbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gY2lyY2xlICJiZWxpZXZlIiBmb3IgcmVsaWdpb3VzIHF1ZXN0aW9ucyB0aGFuIGZhY3QgcXVlc3Rpb25zLCBhbmQgdGhpcyB0ZW5kZW5jeSB3YXMgZGltaW5pc2hlZCBpbiBHaGFuYSBhbmQgZXhhZ2dlcmF0ZWQgaW4gVGhhaWxhbmQuCgpUaGUgc2Vjb25kIG9ydGhvZ29uYWwgY29udHJhc3QgY29tcGFyZWQgQ2hyaXN0aWFuIHRvIEJ1ZGRoaXN0ICJyZWxpZ2lvdXMiIHF1ZXN0aW9ucy4gT3ZlcmFsbCwgcGFydGljaXBhbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gY2lyY2xlICJiZWxpZXZlIiBmb3IgQ2hyaXN0aWFuIHF1ZXN0aW9ucywgYW5kIHRoaXMgdGVuZGVuY3kgd2FzIGV4YWdnZXJhdGVkIGluIEdoYW5hIGFuZCBWYW51YXR1ICh3aGljaCB3ZXJlIHByZWRvbWluYW50bHkgQ2hyaXN0aWFuIHNhbXBsZXMpIGFuZCBkaW1pbmlzaGVkIGluIFRoYWlsYW5kIGFuZCBDaGluYSAod2hpY2ggd2VyZSBtb3JlIEJ1ZGRoaXN0IHNhbXBsZXMpLgoKVGhlIHRoaXJkIG9ydGhvZ29uYWwgY29udHJhc3QgY29tcGFyZWQgd2VsbC1rbm93biBhbmQgZXNvdGVyaWMgZmFjdHMsIG9uIHRoZSBvbmUgaGFuZCwgdG8gcGVyc29uYWwgZmFjdHMsIG9uIHRoZSBvdGhlci4gT3ZlcmFsbCwgcGFydGljaXBhbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gY2lyY2xlICJiZWxpZXZlIiBmb3Igd2VsbC1rbm93biBhbmQgZXNvdGVyaWMgZmFjdHMsIGFuZCB0aGlzIHRlbmRlbmN5IHdhcyBkaW1pbmlzaGVkIGluIEdoYW5hIGFuZCBDaGluYSwgYW5kIGV4YWdnZXJhdGVkIGluIFRoYWlsYW5kIGFuZCBWYW51YXR1LgoKVGhlIGZvdXJ0aCBvcnRob2dvbmFsIGNvbnRyYXN0IGNvbXBhcmVkIHdlbGwta25vd24gdG8gZXNvdGVyaWMgZmFjdHMuIE92ZXJhbGwsIHBhcnRpY3BhbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gY2lyY2xlICJiZWxpZXZlIiBmb3Igd2VsbC1rbm93biBmYWN0cnMsIGFuZCB0aGVuIHRlbmRlbmN5IHdhcyBkaW1pbmlzaGVkIGluIENoaW5hLCBhbmQgZXhhZ2dlcmF0ZWQgaW4gVmFudWF0dS4KCk5vdGUgdGhhdCB0aGVzZSBmaW5kaW5ncyBzdGF0aXN0aWNhbGx5IGNvbnRyb2wgZm9yIGRpZmZlcmVuY2VzIGFjcm9zcyBzYW1wbGVzIGluIHRoZSBvdmVyYWxsIHJhdGUgb2YgY2lyY2xpbmcgImJlbGlldmUiICh3aGljaCB3YXMgZ2VuZXJhbGx5IGhpZ2hlciBpbiBHaGFuYSBhbmQgbG93ZXIgaW4gVGhhaWxhbmQpLgoKCiMgQW5hbHlzaXM6IEJhc2VkIG9uIHByZXJlZ2lzdHJhdGlvbgoKRnJvbSBwcmVyZWdpc3RyYXRpb246Cgo+ICJTdXJ2ZXkgMTogV2Ugd2lsbCBjb25kdWN0IGEgNSAoU2l0ZTogQ2hpbmEgdnMuIFRoYWlsYW5kIHZzLiBWYW51YXR1IHZzLiBHaGFuYSB2cy4gVW5pdGVkIFN0YXRlcykgeCAyIChTdGF0ZW1lbnQgVHlwZTogcmVsaWdpb24gdnMuIGZhY3QpIG1peGVkIEFOT1ZBIHdpdGggcmVwZWF0ZWQgbWVhc3VyZXMgb24gdGhlIHNlY29uZCBmYWN0b3IgYW5kIHRoZSBwcm9wb3J0aW9uIG9mIHRyaWFscyBvbiB3aGljaCBwYXJ0aWNpcGFudHMgY29tcGxldGVkIHNlbnRlbmNlcyB1c2luZyBhIGZvcm0gdGhlIHdvcmQg4oCcYmVsaWV2ZeKAnSAob3IgaXRzIHJlc3BlY3RpdmUgdHJhbnNsYXRpb24pIGFzIHRoZSBkZXBlbmRlbnQgbWVhc3VyZS4gVG8gbG9vayBmb3IgZmluZXItZ3JhaW5lZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRpZmZlcmVudCByZWxpZ2lvdXMgYW5kIGZhY3R1YWwgc3RhdGVtZW50cywgd2Ugd2lsbCBhbHNvIGNvbmR1Y3QgYSA1IChTaXRlOiBDaGluYSB2cy4gVGhhaWxhbmQgdnMuIFZhbnVhdHUgdnMuIEdoYW5hIHZzLiBVbml0ZWQgU3RhdGVzKSB4IDUgKFN0YXRlbWVudCBUeXBlOiBCdWRkaGlzdCByZWxpZ2lvdXMgc3RhdGVtZW50cyB2cy4gQ2hyaXN0aWFuIHJlbGlnaW91cyBzdGF0ZW1lbnRzIHZzLiBsaWZlIGZhY3RzIHZzLiB3ZWxsLWtub3duIGZhY3RzIHZzLiBlc290ZXJpYyBmYWN0cykgbWl4ZWQgQU5PVkEgd2l0aCByZXBlYXRlZCBtZWFzdXJlcyBvbiB0aGUgc2Vjb25kIGZhY3RvciBhbmQgdGhlIHByb3BvcnRpb24gb2YgdHJpYWxzIG9uIHdoaWNoIHBhcnRpY2lwYW50cyBjb21wbGV0ZWQgc2VudGVuY2VzIHVzaW5nIGEgZm9ybSBvZiB0aGUgd29yZCDigJxiZWxpZXZl4oCdIChvciBpdHMgcmVzcGVjdGl2ZSB0cmFuc2xhdGlvbikgYXMgdGhlIGRlcGVuZGVudCBtZWFzdXJlLiBJbiBhbGwgY2FzZXMgd2hlcmUgb21uaWJ1cyBBTk9WQXMgYXJlIHNpZ25pZmljYW50LCB3ZSB3aWxsIGNvbmR1Y3QgcGFpcndpc2UgYW5hbHlzZXMgY29tcGFyaW5nIGVhY2ggc3RhdGVtZW50IHR5cGUgd2l0aCBlYWNoIG90aGVyIHN0YXRlbWVudCB0eXBlIGFuZCBlYWNoIHNpdGUgd2l0aCBlYWNoIG90aGVyIHNpdGUuIgoKYGBge3IsIGVjaG8gPSBUfQpkMV9hbm92YSA8LSBkMV9sb25nICU+JQogIGRpc3RpbmN0KHRoYjFfc3ViaiwgY291bnRyeSwgc3VwZXJfY2F0LCBxdWVzdGlvbiwgYmVsaWV2ZSkgJT4lCiAgZ3JvdXBfYnkodGhiMV9zdWJqLCBjb3VudHJ5LCBzdXBlcl9jYXQpICU+JQogIHN1bW1hcmlzZShwcm9wX2JlbGlldmUgPSBtZWFuKGJlbGlldmUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHRoYjFfc3ViaiA9IGZhY3Rvcih0aGIxX3N1YmopKQoKY29udHJhc3RzKGQxX2Fub3ZhJGNvdW50cnkpIDwtIGNvbnRyYXN0X2NvdW50cnkKY29udHJhc3RzKGQxX2Fub3ZhJHN1cGVyX2NhdCkgPC0gY29udHJhc3Rfc3VwZXJfY2F0CmBgYAoKIyMgUHJlcmVnIEFuYWx5c2lzICMxCgpIZXJlIGlzIHRoZSBmaXJzdCBwcmVyZWdpc3RlcmVkIGFuYWx5aXM6IGEgNSAoY291bnRyeSkgeCAyIChxdWVzdGlvbiBjYXRlZ29yeSkgbWl4ZWQgQU5PVkEgd2l0aCByZXBlYXRlZCBtZWFzdXJlcyBvbiB0aGUgc2Vjb25kIGZhY3RvciBhbmQgdGhlIHByb3BvcnRpb24gb2YgdHJpYWxzIG9uIHdoaWNoIHBhcnRpY2lwYW50cyBjaXJjbGVkICJiZXJsaWV2ZSIgYXMgdGhlIERWLgoKYGBge3IsIGVjaG8gPSBUfQpyMS40IDwtIGQxX2Fub3ZhICU+JQogIGFub3ZhX3Rlc3QoZHYgPSBwcm9wX2JlbGlldmUsIAogICAgICAgICAgICAgd2lkID0gdGhiMV9zdWJqLCAKICAgICAgICAgICAgIGJldHdlZW4gPSBjb3VudHJ5LCAKICAgICAgICAgICAgIHdpdGhpbiA9IHN1cGVyX2NhdCkKCmdldF9hbm92YV90YWJsZShyMS40KQpgYGAKClRoaXMgYW5hbHlzaXMgYWxpZ25zIHdpdGggdGhlIHJlZ3Jlc3Npb25zIGFib3ZlLCBzdWdnZXN0aW5nIHRoYXQgcGFydGljaXBhbnRzJyB0ZW5kZW5jeSB0byBjaXJjbGUgImJlbGlldmUiIHZhcmllZCBieSBjb3VudHJ5L2xhbmd1YWdlIChgY291bnRyeWApIGFuZCBieSBxdWVzdGlvbiBjYXRlZ29yeSAoYHN1cGVyX2NhdGApLCBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBxdWVzdGlvbiBjYXRlZ29yeSB2YXJpZWQgYWNyb3NzIGNvdW50cmllcy9sYW5ndWFnZXMgKGkuZS4sIHRoZXJlIHdhcyBhbiBpbnRlcmFjdGlvbjogYGNvdW50cnk6c3VwZXJfY2F0YCkuCgpUaGUgcHJlcmVnaXN0cmF0aW9uIGluZGljYXRlZCB0aGF0IHdlJ2QgY29uZHVjdCBwYWlyd2lzZSBmb2xsb3ctdXAgYW5hbHlzZXMgY29tcGFyaW5nIHRoZSB0d28gcXVlc3Rpb24gY2F0ZWdvcmllcyBhbmQgY29tcGFyaW5nIHBhaXJzIG9mIGNvdW50aXJlcy9sYW5ndWFnZXMgLS0gYnV0IEkgZG9uJ3QgcmVhbGx5IHRoaW5rIHdlJ3JlIGludGVyZXN0ZWQgaW4gY29tcGFyaW5nIHBhaXJzIG9mIGNvdW50cmllcy9sYW5ndWFnZXMsIHNvIEknbSBnb2luZyB0byBza2lwIHRoYXQgZm9yIG5vdy4gSW5zdGVhZCwgSSdsbCBjb21wYXJlIHRoZSB0d28gcXVlc3Rpb25zIGNhdGVnb3JpZXMgd2l0aGluIGVhY2ggY291bnRyeS9sYW5ndWFnZSAodG8gZXhwbG9yZSB0aGUgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24pLgoKSGVyZSB3ZSBnbzoKCiMjIyBDb21wYXJpbmcgcXVlc3Rpb24gY2F0ZWdvcmllcwoKYGBge3IsIGVjaG8gPSBUfQpyMS41YSA8LSB0LnRlc3QocHJvcF9iZWxpZXZlIH4gc3VwZXJfY2F0LCBwYWlyZWQgPSBULCBkMV9hbm92YSk7IHIxLjVhCmBgYAoKQ29sbGFwc2luZyBhY3Jvc3MgY291bnRyaWVzL2xhbmd1YWdlcywgKipwYXJ0aWNpcGFudHMgY2lyY2xlZCBzaWduaWZpY2FudGx5IG1vcmUgImJlbGlldmUiIHJlc3BvbnNlcyBmb3IgcXVlc3Rpb25zIGluIHRoZSByZWxpZ2lvdXMgY2F0ZWdvcnkgKGByIDEwMCAqIChyMS41YSRlc3RpbWF0ZVsxXSAlPiUgcm91bmQoMikpYCUpIHRoYW4gdGhleSBkaWQgZm9yIHF1ZXN0aW9ucyBpbiB0aGUgZmFjdCBjYXRlZ29yeSAoYHIgMTAwICogKHIxLjVhJGVzdGltYXRlWzJdICU+JSByb3VuZCgyKSlgJSkqKi4KCiMjIyBDb21wYXJpbmcgcXVlc3Rpb24gY2F0ZWdvcmllcyB3aXRoaW4gY291bnRyaWVzL2xhbmd1YWdlcwoKYGBge3IsIGVjaG8gPSBUfQojIFVTCnIxLjViX3VzIDwtIHQudGVzdChwcm9wX2JlbGlldmUgfiBzdXBlcl9jYXQsIHBhaXJlZCA9IFQsCiAgICAgICAgICAgICAgICAgICBkMV9hbm92YSAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlVTIikpOyByMS41Yl91cwoKIyBHaGFuYQpyMS41Yl9naCA8LSB0LnRlc3QocHJvcF9iZWxpZXZlIH4gc3VwZXJfY2F0LCBwYWlyZWQgPSBULAogICAgICAgICAgICAgICAgICAgZDFfYW5vdmEgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJHaGFuYSIpKTsgcjEuNWJfZ2gKCiMgVGhhaWxhbmQKcjEuNWJfdGggPC0gdC50ZXN0KHByb3BfYmVsaWV2ZSB+IHN1cGVyX2NhdCwgcGFpcmVkID0gVCwKICAgICAgICAgICAgICAgICAgIGQxX2Fub3ZhICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiVGhhaWxhbmQiKSk7IHIxLjViX3RoCgojIENoaW5hCnIxLjViX2NoIDwtIHQudGVzdChwcm9wX2JlbGlldmUgfiBzdXBlcl9jYXQsIHBhaXJlZCA9IFQsCiAgICAgICAgICAgICAgICAgICBkMV9hbm92YSAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkNoaW5hIikpOyByMS41Yl9jaAoKIyBWYW51YXR1CnIxLjViX3Z0IDwtIHQudGVzdChwcm9wX2JlbGlldmUgfiBzdXBlcl9jYXQsIHBhaXJlZCA9IFQsCiAgICAgICAgICAgICAgICAgICBkMV9hbm92YSAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlZhbnVhdHUiKSk7IHIxLjViX3Z0CmBgYAoKKipUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHF1ZXN0aW9uIGNhdGVnb3JpZXMgd2FzIHNpZ25pZmljYW50IGluIGVhY2ggY291bnRyeS9sYW5ndWFnZSBjb25zaWRlcmVkIGFsb25lLioqCgoKIyBBbmFseXNpczogUmVsaWdpb24gYW5kIHJlbGlnaW9zaXR5CgojIyBEZW1vZ3JhcGhpY3MKCkZpcnN0LCBsZXQncyBqdXN0IGxvb2sgYXQgaG93IHBlb3BsZSBpbiBkaWZmZXJlbnQgY291bnRyaWVzIHJlcGxpZWQgdG8gdGhlIHJlbGV2YW50IHF1ZXN0aW9ucy4gCgojIyMgYHRoYjFfZGVtb19yZWdwYDogIkFyZSB5b3UgYSBwYXJ0IG9mIGFueSByZWxpZ2lvdXMgZ3JvdXA/IgoKYGBge3J9CmQxICU+JSAKICBsZWZ0X2pvaW4oc2FtcGxlX3NpemVfZDEpICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnlfbiwgCiAgICAgICAgICAgICAjIHB1dCBOQXMgb24gdG9wIG9mIGJhcgogICAgICAgICAgICAgZmlsbCA9IGZhY3Rvcih0aGIxX2RlbW9fcmVncCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhOQSwgIk5PIiwgIllFUyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZSA9IE5VTEwpKSkgKwogIGdlb21fYmFyKCkgKwogIGxhYnMoeCA9ICJjb3VudHJ5IiwgeSA9ICJwcm9wb3J0aW9uIiwgCiAgICAgICBmaWxsID0gIkFyZSB5b3UgYSBwYXJ0IG9mIGFueSByZWxpZ2lvdXMgZ3JvdXA/IikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQpgYGAKCiMjIyBgdGhiMV9kZW1vX3JlbHlgOiAiRnJvbSAxIHRvIDcsIGhvdyByZWxpZ2lvdXMgYXJlIHlvdT8gKDEgPSBub3QgcmVsaWdpb3VzIGF0IGFsbCwgNyA9CmV4dHJlbWVseSByZWxpZ2lvdXMpIgoKU2VlbXMgdG8gaGF2ZSBiZWVuIG9taXR0ZWQgaW4gVGhhaWxhbmQ/CgpgYGB7cn0KZDEgJT4lIAogIGxlZnRfam9pbihzYW1wbGVfc2l6ZV9kMSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYXMubnVtZXJpYyh0aGIxX2RlbW9fcmVseSkpKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnlfbikgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjcsIG1pbm9yX2JyZWFrcyA9IE5VTEwpICsKICBsYWJzKHggPSAiRnJvbSAxIHRvIDcsIGhvdyByZWxpZ2lvdXMgYXJlIHlvdT8iLCAKICAgICAgIHkgPSAiY291bnQiKQpgYGAKCiMjIyBgdGhiMV9kZW1vX2ltcHJgOiAiRnJvbSAxIHRvIDcsIGhvdyBpbXBvcnRhbnQgdG8geW91IGlzIHlvdXIgcmVsaWdpb3VzIHByYWN0aWNlPyAgKDEgPSBub3QgaW1wb3J0YW50IGF0IGFsbCwgNyA9IG9mIHV0bW9zdCBpbXBvcnRhbmNlKSIKClNlZW1zIHRvIGhhdmUgYmVlbiBvbWl0dGVkIGluIFRoYWlsYW5kPwoKYGBge3J9CmQxICU+JSAKICBsZWZ0X2pvaW4oc2FtcGxlX3NpemVfZDEpICU+JQogIGdncGxvdChhZXMoeCA9IGFzLm51bWVyaWModGhiMV9kZW1vX2ltcHIpKSkgKwogIGZhY2V0X2dyaWQofiBjb3VudHJ5X24pICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMTo3LCBtaW5vcl9icmVha3MgPSBOVUxMKSArCiAgbGFicyh4ID0gIkZyb20gMSB0byA3LCBob3cgaW1wb3J0YW50IHRvIHlvdSBpcyB5b3VyIHJlbGlnaW91cyBwcmFjdGljZT8iLCAKICAgICAgIHkgPSAiY291bnQiKQpgYGAKCiMjIyBgdGhiMV9kZW1vX3dvcnNgOiAiSG93IG9mdGVuIGRvIHlvdSBhdHRlbmQgcGxhY2VzIG9mIHdvcnNoaXA/IgoKYGBge3J9CmQxICU+JSAKICBsZWZ0X2pvaW4oc2FtcGxlX3NpemVfZDEpICU+JQogIGdncGxvdChhZXMoeCA9IHRoYjFfZGVtb193b3JzKSkgKwogIGZhY2V0X2dyaWQofiBjb3VudHJ5X24pICsKICBnZW9tX2JhcigpICsKICBsYWJzKHggPSAiSG93IG9mdGVuIGRvIHlvdSBhdHRlbmQgcGxhY2VzIG9mIHdvcnNoaXA/IiwgCiAgICAgICB5ID0gImNvdW50IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKYGBgCgojIyMgYHRoYjFfZGVtb19iZ29kYDogIldoYXQgYmVzdCBkZXNjcmliZXMgeW91ciBsZXZlbCBvZiBiZWxpZWYgaW4gR29kPyIKCmBgYHtyfQpkMSAlPiUgCiAgbGVmdF9qb2luKHNhbXBsZV9zaXplX2QxKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0aGIxX2RlbW9fYmdvZCkpICsKICBmYWNldF9ncmlkKH4gY291bnRyeV9uKSArCiAgZ2VvbV9iYXIoKSArCiAgbGFicyh4ID0gIldoYXQgYmVzdCBkZXNjcmliZXMgeW91ciBsZXZlbCBvZiBiZWxpZWYgaW4gR29kPyIsIAogICAgICAgeSA9ICJjb3VudCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKIyMjIGB0aGIxX2RlbW9fYmJ1aGA6ICJXaGF0IGJlc3QgZGVzY3JpYmVzIHlvdXIgbGV2ZWwgb2YgYmVsaWVmIGluIEJ1ZGRoYT8iCgpgYGB7cn0KZDEgJT4lIAogIGxlZnRfam9pbihzYW1wbGVfc2l6ZV9kMSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGhiMV9kZW1vX2JidWgpKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnlfbikgKwogIGdlb21fYmFyKCkgKwogIGxhYnMoeCA9ICJXaGF0IGJlc3QgZGVzY3JpYmVzIHlvdXIgbGV2ZWwgb2YgYmVsaWVmIGluIEJ1ZGRoYT8iLCAKICAgICAgIHkgPSAiY291bnQiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpgYGAKCiMjIyBgdGhiMV9kZW1vX2Jvc3BgOiAiV2hhdCBiZXN0IGRlc2NyaWJlcyB5b3VyIGxldmVsIG9mIGJlbGllZiBpbiBhbm90aGVyIHNwaXJpdHVhbCBiZWluZyAob3RoZXIgdGhhbiBHb2Qgb3IgQnVkZGhhKT8iCgpgYGB7cn0KZDEgJT4lIAogIGxlZnRfam9pbihzYW1wbGVfc2l6ZV9kMSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGhiMV9kZW1vX2Jvc3ApKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnlfbikgKwogIGdlb21fYmFyKCkgKwogIGxhYnMoeCA9ICJXaGF0IGJlc3QgZGVzY3JpYmVzIHlvdXIgbGV2ZWwgb2YgYmVsaWVmIGluIGFub3RoZXIgc3Bpcml0dWFsIGJlaW5nIChvdGhlciB0aGFuIEdvZCBvciBCdWRkaGEpPyIsIAogICAgICAgeSA9ICJjb3VudCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKIyMjIGB0aGIxX2RlbW9fYXRzbmA6ICJXaGF0IGJlc3QgZGVzY3JpYmVzIHlvdXIgYXR0aXR1ZGUgdG93YXJkcyB0aGUgc3VwZXJuYXR1cmFsPwoKYGBge3IsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmFzcCA9IDAuOH0KZDEgJT4lIAogIGxlZnRfam9pbihzYW1wbGVfc2l6ZV9kMSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGhiMV9kZW1vX2F0c24pKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnlfbikgKwogIGdlb21fYmFyKCkgKwogIGxhYnMoeCA9ICJXaGF0IGJlc3QgZGVzY3JpYmVzIHlvdXIgYXR0aXR1ZGUgdG93YXJkcyB0aGUgc3VwZXJuYXR1cmFsPyIsIAogICAgICAgeSA9ICJjb3VudCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKIyMjIGB0aGIxX2RlbW9faW1zbmA6ICJGcm9tIDEgdG8gNywgaG93IGltcG9ydGFudCB0byB5b3UgaXMgeW91ciBhdHRpdHVkZSB0b3dhcmQgdGhlIHN1cGVybmF0dXJhbD8gKDEgPSBub3QgaW1wb3J0YW50IGF0IGFsbCwgNyA9IG9mIHV0bW9zdCBpbXBvcnRhbmNlKSIKCmBgYHtyfQpkMSAlPiUgCiAgbGVmdF9qb2luKHNhbXBsZV9zaXplX2QxKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhcy5udW1lcmljKHRoYjFfZGVtb19pbXNuKSkpICsKICBmYWNldF9ncmlkKH4gY291bnRyeV9uKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6NywgbWlub3JfYnJlYWtzID0gTlVMTCkgKwogIGxhYnMoeCA9ICJGcm9tIDEgdG8gNywgaG93IGltcG9ydGFudCB0byB5b3UgaXMgeW91ciBhdHRpdHVkZSB0b3dhcmQgdGhlIHN1cGVybmF0dXJhbD8iLCAKICAgICAgIHkgPSAiY291bnQiKQpgYGAKCiMjIEFuYWx5c2VzCgpOb3csIGxldCdzIGxvb2sgYXQgaG93IHJlc3BvbnNlcyB0byBvdXIgdGhpbmsvYmVsaWV2ZSBxdWVzdGlvbnMgbWlnaHQgaGF2ZSB2YXJpZWQgZGVwZW5kaW5nIG9uIHJlbGlnaW9zaXR5L2V0Yy4gRm9yIG5vdywgSSdsbCBqdXN0IGZvY3VzIG9uIGEgY291cGxlIG9mIHZhcmlhYmxlcyB0aGF0IHNlZW0gdG8gaGF2ZSBiZWVuIGFuc3dlcmVkIGluIHJlYXNvbmFibGUgd2F5cy4KCiMjIyBgdGhiMV9kZW1vX3JlbHlgOiDigJxGcm9tIDEgdG8gNywgaG93IHJlbGlnaW91cyBhcmUgeW91PyAoMSA9IG5vdCByZWxpZ2lvdXMgYXQgYWxsLCA3ID0gZXh0cmVtZWx5IHJlbGlnaW91cynigJ0KCmBgYHtyLCBlY2hvID0gVH0KcjEuNiA8LSBsbWVyKGJlbGlldmUgfiBzdXBlcl9jYXQgKiBjb3VudHJ5ICogdGhiMV9kZW1vX3JlbHlfbnVtCiAgICAgICAgICAgICArICgxICsgc3VwZXJfY2F0IHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLAogICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcgJT4lIAogICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSAhPSAiVGhhaWxhbmQiKSAlPiUKICAgICAgICAgICAgICAgbXV0YXRlKHRoYjFfZGVtb19yZWx5X251bSA9IHNjYWxlKHRoYjFfZGVtb19yZWx5X251bSkpLAogICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChjb3VudHJ5ID0gImNvbnRyLnN1bSIpKQpgYGAKCmBgYHtyfQpyZWd0YWJfZnVuKHIxLjYsIHN0ZF9iZXRhID0gVCwgCiAgICAgICAgICAgY291bnRyeV92YXIxID0gImNvdW50cnkxIiwgY291bnRyeV9uYW1lMSA9ICJDb3VudHJ5IChVUykiLAogICAgICAgICAgIGNvdW50cnlfdmFyMiA9ICJjb3VudHJ5MiIsIGNvdW50cnlfbmFtZTIgPSAiQ291bnRyeSAoR2hhbmEpIiwKICAgICAgICAgICBjb3VudHJ5X3ZhcjMgPSAiY291bnRyeTMiLCBjb3VudHJ5X25hbWUzID0gIkNvdW50cnkgKENoaW5hKSIsCiAgICAgICAgICAgcHJlZGljdG9yX3ZhcjEgPSAidGhiMV9kZW1vX3JlbHlfbnVtIiwgCiAgICAgICAgICAgcHJlZGljdG9yX25hbWUxID0gIkhvdyByZWxpZ2lvdXMgYXJlIHlvdT8iKSAlPiUgCiAgcmVndGFiX3N0eWxlX2Z1bihyb3dfZW1waCA9IGMoMTAsIDE0OjE2KSkKYGBgCgpUaGlzIGFuYWx5c2lzIHN1Z2dlc3RzIHRoYXQgZ3JlYXRlciByZWxpZ2lvc2l0eSB3YXMgYXNzb2NpYXRlZCB3aXRoIGFuIGluY3JlYXNlZCBkaXN0aW5jdGlvbiBiZXR3ZWVuIHJlbGlnaW91cyBhbmQgZmFjdCBxdWVzdGlvbnMuIChOb3RlIHRoYXQgdGhpcyBhbmFseXNpcyBvbWl0cyBwYXJ0aWNpcGFudHMgZnJvbSBUaGFpbGFuZCwgd2hvIGRpZCBub3QgYW5zd2VyIHRoaXMgcXVlc3Rpb24gYWJvdXQgcmVsaWdpb3NpdHkuKQoKYGBge3J9CmQxX2xvbmcgJT4lIAogIGZpbHRlcihjb3VudHJ5ICE9ICJUaGFpbGFuZCIpICU+JQogIGdyb3VwX2J5KGNvdW50cnksIHRoYjFfc3ViaiwgdGhiMV9kZW1vX3JlbHlfbnVtLCBzdXBlcl9jYXQpICU+JQogIHN1bW1hcmlzZShiZWxpZXZlX3Byb3AgPSBtZWFuKGJlbGlldmUsIG5hLnJtID0gVCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0aGIxX2RlbW9fcmVseV9udW0sIHkgPSBiZWxpZXZlX3Byb3AsIGNvbG9yID0gc3VwZXJfY2F0KSkgKwogIGZhY2V0X2dyaWQoLiB+IGNvdW50cnkpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMiwgd2lkdGggPSAwLjEsIGhlaWdodCA9IDAuMDIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDA6NiwgbGFiZWxzID0gbGV2ZWxzKGQxJHRoYjFfZGVtb19yZWx5KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArCiAgbGFicyh4ID0gIkhvdyByZWxpZ2lvdXMgYXJlIHlvdT8iLCB5ID0gIlByb3BvcnRpb24gJ2JlbGlldmUnIHJlc3BvbnNlcyIsCiAgICAgICBjb2xvciA9ICJDYXRlZ29yeSIpCmBgYAoKYGBge3J9CmQxX2xvbmcgJT4lIAogIGZpbHRlcihjb3VudHJ5ICE9ICJUaGFpbGFuZCIpICU+JQogIGdyb3VwX2J5KGNvdW50cnksIHRoYjFfc3ViaiwgdGhiMV9kZW1vX3JlbHlfbnVtLCBzdXBlcl9jYXQpICU+JQogIHN1bW1hcmlzZShiZWxpZXZlX3Byb3AgPSBtZWFuKGJlbGlldmUsIG5hLnJtID0gVCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzcHJlYWQoc3VwZXJfY2F0LCBiZWxpZXZlX3Byb3ApICU+JQogIG11dGF0ZShkaWZmID0gcmVsaWdpb3VzIC0gZmFjdCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGhiMV9kZW1vX3JlbHlfbnVtLCB5ID0gZGlmZikpICsKICBmYWNldF9ncmlkKC4gfiBjb3VudHJ5KSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjIsIHdpZHRoID0gMC4xLCBoZWlnaHQgPSAwLjAyKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAwOjYsIGxhYmVscyA9IGxldmVscyhkMSR0aGIxX2RlbW9fcmVseSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIGxhYnMoeCA9ICJIb3cgcmVsaWdpb3VzIGFyZSB5b3U/IiwgCiAgICAgICB5ID0gIkRpZmZlcmVuY2UgaW4gcHJvcG9ydGlvbiAnYmVsaWV2ZScgcmVzcG9uc2VzXG4ocmVsaWdpb3VzIHF1ZXN0aW9ucyAtIGZhY3QgcXVlc3Rpb25zKSIsCiAgICAgICBjb2xvciA9ICJDYXRlZ29yeSIpCmBgYAoKIyMjIGB0aGIxX2RlbW9faW1wcmA6ICJGcm9tIDEgdG8gNywgaG93IGltcG9ydGFudCB0byB5b3UgaXMgeW91ciByZWxpZ2lvdXMgcHJhY3RpY2U/ICAoMSA9IG5vdCBpbXBvcnRhbnQgYXQgYWxsLCA3ID0gb2YgdXRtb3N0IGltcG9ydGFuY2UpIgoKYGBge3IsIGVjaG8gPSBUfQpyMS43IDwtIGxtZXIoYmVsaWV2ZSB+IHN1cGVyX2NhdCAqIGNvdW50cnkgKiB0aGIxX2RlbW9faW1wcl9udW0KICAgICAgICAgICAgICsgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksCiAgICAgICAgICAgICBkYXRhID0gZDFfbG9uZyAlPiUgCiAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ICE9ICJUaGFpbGFuZCIpICU+JQogICAgICAgICAgICAgICBtdXRhdGUodGhiMV9kZW1vX2ltcHJfbnVtID0gc2NhbGUodGhiMV9kZW1vX2ltcHJfbnVtKSksCiAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGNvdW50cnkgPSAiY29udHIuc3VtIikpCmBgYAoKYGBge3J9CnJlZ3RhYl9mdW4ocjEuNywgc3RkX2JldGEgPSBULCAKICAgICAgICAgICBjb3VudHJ5X3ZhcjEgPSAiY291bnRyeTEiLCBjb3VudHJ5X25hbWUxID0gIkNvdW50cnkgKFVTKSIsCiAgICAgICAgICAgY291bnRyeV92YXIyID0gImNvdW50cnkyIiwgY291bnRyeV9uYW1lMiA9ICJDb3VudHJ5IChHaGFuYSkiLAogICAgICAgICAgIGNvdW50cnlfdmFyMyA9ICJjb3VudHJ5MyIsIGNvdW50cnlfbmFtZTMgPSAiQ291bnRyeSAoQ2hpbmEpIiwKICAgICAgICAgICBwcmVkaWN0b3JfdmFyMSA9ICJ0aGIxX2RlbW9faW1wcl9udW0iLCAKICAgICAgICAgICBwcmVkaWN0b3JfbmFtZTEgPSAiSG93IGltcG9ydGFudCBpcyB5b3VyIHJlbGlnaW91cyBwcmFjdGljZT8iKSAlPiUgCiAgcmVndGFiX3N0eWxlX2Z1bihyb3dfZW1waCA9IGMoMTAsIDE0OjE2KSkKYGBgCgpUaGlzIGFuYWx5c2lzIHN1Z2dlc3RzIHRoYXQgbW9yZSBpbXBvcnRhbmNlIHBsYWNlZCBvbiByZWxpZ2lvdXMgcHJhY3RpY2Ugd2FzIGFzc29jaWF0ZWQgd2l0aCBhbiBpbmNyZWFzZWQgZGlzdGluY3Rpb24gYmV0d2VlbiByZWxpZ2lvdXMgYW5kIGZhY3QgcXVlc3Rpb25zLiAoTm90ZSB0aGF0IHRoaXMgYW5hbHlzaXMgb21pdHMgcGFydGljaXBhbnRzIGZyb20gVGhhaWxhbmQsIHdobyBkaWQgbm90IGFuc3dlciB0aGlzIHF1ZXN0aW9uIGFib3V0IHJlbGlnaW9zaXR5LikKCmBgYHtyfQpkMV9sb25nICU+JSAKICBmaWx0ZXIoY291bnRyeSAhPSAiVGhhaWxhbmQiKSAlPiUKICBncm91cF9ieShjb3VudHJ5LCB0aGIxX3N1YmosIHRoYjFfZGVtb19pbXByX251bSwgc3VwZXJfY2F0KSAlPiUKICBzdW1tYXJpc2UoYmVsaWV2ZV9wcm9wID0gbWVhbihiZWxpZXZlLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGhiMV9kZW1vX2ltcHJfbnVtLCB5ID0gYmVsaWV2ZV9wcm9wLCBjb2xvciA9IHN1cGVyX2NhdCkpICsKICBmYWNldF9ncmlkKC4gfiBjb3VudHJ5KSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjIsIHdpZHRoID0gMC4xLCBoZWlnaHQgPSAwLjAyKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAwOjYsIGxhYmVscyA9IGxldmVscyhkMSR0aGIxX2RlbW9faW1wcikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIGxhYnMoeCA9ICJIb3cgaW1wb3J0YW50IGlzIHlvdXIgcmVsaWdpb3VzIHByYWN0aWNlPyIsIHkgPSAiUHJvcG9ydGlvbiAnYmVsaWV2ZScgcmVzcG9uc2VzIiwKICAgICAgIGNvbG9yID0gIkNhdGVnb3J5IikKYGBgCgpgYGB7cn0KZDFfbG9uZyAlPiUgCiAgZmlsdGVyKGNvdW50cnkgIT0gIlRoYWlsYW5kIikgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgdGhiMV9zdWJqLCB0aGIxX2RlbW9faW1wcl9udW0sIHN1cGVyX2NhdCkgJT4lCiAgc3VtbWFyaXNlKGJlbGlldmVfcHJvcCA9IG1lYW4oYmVsaWV2ZSwgbmEucm0gPSBUKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHNwcmVhZChzdXBlcl9jYXQsIGJlbGlldmVfcHJvcCkgJT4lCiAgbXV0YXRlKGRpZmYgPSByZWxpZ2lvdXMgLSBmYWN0KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0aGIxX2RlbW9faW1wcl9udW0sIHkgPSBkaWZmKSkgKwogIGZhY2V0X2dyaWQoLiB+IGNvdW50cnkpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMiwgd2lkdGggPSAwLjEsIGhlaWdodCA9IDAuMDIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDA6NiwgbGFiZWxzID0gbGV2ZWxzKGQxJHRoYjFfZGVtb19pbXByKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArCiAgbGFicyh4ID0gIkhvdyBpbXBvcnRhbnQgaXMgeW91ciByZWxpZ2lvdXMgcHJhY3RpY2U/IiwgCiAgICAgICB5ID0gIkRpZmZlcmVuY2UgaW4gcHJvcG9ydGlvbiAnYmVsaWV2ZScgcmVzcG9uc2VzXG4ocmVsaWdpb3VzIHF1ZXN0aW9ucyAtIGZhY3QgcXVlc3Rpb25zKSIsCiAgICAgICBjb2xvciA9ICJDYXRlZ29yeSIpCmBgYAoKIyMjIGB0aGIxX2RlbW93b3JzYDogIkhvdyBvZnRlbiBkbyB5b3UgYXR0ZW5kIHBsYWNlcyBvZiB3b3JzaGlwPyIKCmBgYHtyLCBlY2hvID0gVH0KcjEuOCA8LSBsbWVyKGJlbGlldmUgfiBzdXBlcl9jYXQgKiBjb3VudHJ5ICogdGhiMV9kZW1vX3dvcnNfbnVtCiAgICAgICAgICAgICArICgxICsgc3VwZXJfY2F0IHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLAogICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcgJT4lIAogICAgICAgICAgICAgICBtdXRhdGUodGhiMV9kZW1vX3dvcnNfbnVtID0gc2NhbGUodGhiMV9kZW1vX3dvcnNfbnVtKSkpCmBgYAoKYGBge3J9CnJlZ3RhYl9mdW4ocjEuOCwgc3RkX2JldGEgPSBULCAKICAgICAgICAgICBwcmVkaWN0b3JfdmFyMSA9ICJ0aGIxX2RlbW9fd29yc19udW0iLCAKICAgICAgICAgICBwcmVkaWN0b3JfbmFtZTEgPSAiSG93IG9mdGVuIGRvIHlvdSBhdHRlbmQgcGxhY2VzIG9mIHdvcnNoaXA/IikgJT4lIAogIHJlZ3RhYl9zdHlsZV9mdW4ocm93X2VtcGggPSBjKDEyLCAxNzoyMCkpCmBgYAoKVGhpcyBhbmFseXNpcyBzdWdnZXN0cyB0aGF0IGZyZXF1ZW5jeSBvZiBhdHRlbmRlbmNlIHdhcyBhc3NvY2lhdGVkIHdpdGggYW4gaW5jcmVhc2VkIGRpc3RpbmN0aW9uIGJldHdlZW4gcmVsaWdpb3VzIGFuZCBmYWN0IHF1ZXN0aW9ucy4gCgpgYGB7cn0KZDFfbG9uZyAlPiUgCiAgZ3JvdXBfYnkoY291bnRyeSwgdGhiMV9zdWJqLCB0aGIxX2RlbW9fd29yc19udW0sIHN1cGVyX2NhdCkgJT4lCiAgc3VtbWFyaXNlKGJlbGlldmVfcHJvcCA9IG1lYW4oYmVsaWV2ZSwgbmEucm0gPSBUKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGdncGxvdChhZXMoeCA9IHRoYjFfZGVtb193b3JzX251bSwgeSA9IGJlbGlldmVfcHJvcCwgY29sb3IgPSBzdXBlcl9jYXQpKSArCiAgZmFjZXRfZ3JpZCguIH4gY291bnRyeSkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4yLCB3aWR0aCA9IDAuMSwgaGVpZ2h0ID0gMC4wMikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMDo0LCBsYWJlbHMgPSBsZXZlbHMoZDEkdGhiMV9kZW1vX3dvcnMpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh4ID0gIkhvdyBvZnRlbiBkbyB5b3UgYXR0ZW5kIHBsYWNlcyBvZiB3b3JzaGlwPyIsIAogICAgICAgeSA9ICJQcm9wb3J0aW9uICdiZWxpZXZlJyByZXNwb25zZXMiLAogICAgICAgY29sb3IgPSAiQ2F0ZWdvcnkiKQpgYGAKCmBgYHtyfQpkMV9sb25nICU+JSAKICBncm91cF9ieShjb3VudHJ5LCB0aGIxX3N1YmosIHRoYjFfZGVtb193b3JzX251bSwgc3VwZXJfY2F0KSAlPiUKICBzdW1tYXJpc2UoYmVsaWV2ZV9wcm9wID0gbWVhbihiZWxpZXZlLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc3ByZWFkKHN1cGVyX2NhdCwgYmVsaWV2ZV9wcm9wKSAlPiUKICBtdXRhdGUoZGlmZiA9IHJlbGlnaW91cyAtIGZhY3QpICU+JQogIGdncGxvdChhZXMoeCA9IHRoYjFfZGVtb193b3JzX251bSwgeSA9IGRpZmYpKSArCiAgZmFjZXRfZ3JpZCguIH4gY291bnRyeSkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4yLCB3aWR0aCA9IDAuMSwgaGVpZ2h0ID0gMC4wMikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMDo0LCBsYWJlbHMgPSBsZXZlbHMoZDEkdGhiMV9kZW1vX3dvcnMpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh4ID0gIkhvdyBvZnRlbiBkbyB5b3UgYXR0ZW5kIHBsYWNlcyBvZiB3b3JzaGlwPyIsIAogICAgICAgeSA9ICJEaWZmZXJlbmNlIGluIHByb3BvcnRpb24gJ2JlbGlldmUnIHJlc3BvbnNlc1xuKHJlbGlnaW91cyBxdWVzdGlvbnMgLSBmYWN0IHF1ZXN0aW9ucykiLAogICAgICAgY29sb3IgPSAiQ2F0ZWdvcnkiKQpgYGAKCgoKCg==